Pull to refresh

Comments 13

Каждый запуск скрипта ведь заново запускает wolfram kernel и занимает очень много времени?
Верно. Причем при генерации картинки оно еще и фронтенд запускает, судя по всему. Сделал кое-какие замеры:

MacBook Pro Retina Mid 2014:

op=Now 0.290 s
op=TestGraph 1.5 s

Raspberry Pi Model 2:
op=Now 3.4 s
op=TestGraph 7.6 s
Эмм, то есть получается, что на Wolfram Language написан не сам сервер, а лишь своего рода cgi-скрипт. А сервер написан на питоне
Строго говоря, да. Я не нашел какого-либо прямого способа работы с сокетами в Wolfram Language. Вообще, при написании этой статьи была робкая надежда, что где-то в комментариях объявится кто-то, кто скажет «Да как так можно-то? Вот как эту задачу нужно было решить на самом деле».

Очень интересно наблюдать за процессом становления WL как языка и системы общего назначения, но судя по всему, не только я блуждаю в потемках, пытаясь найти способы более приземленного применения. При этом прочувствовав силу WL очень сложно потом заставить себя переписывать решение на другом языке только потому, что там гораздо больше вариантов развертывания.
Кстати говоря, раз уж вы начали говорить о «силе WL», не расскажете, в чем именно его сила, что отличает его от других языков общего назначения? Когда я с ним игрался (может, год назад), я увидел 2(3) вещи:
1. Куча встроенных функций на все случаи жизни
2. Эти самые функции можно удобно между собой комбинировать — вывод одной можно направить на вход другой.
возможно, 3. одна и та же функция может принимать аргументы разных типов

Это всё или есть еще что-то интересное? Есть ли что-то, что принципиально невозможно/сложно сделать в другом языке, вроде python или даже ruby?
Вам тоже советую мой пост пятиминутной давности: Wolfram Language (Mathematica) — это просто игрушка. Сила WL в функциональном программировании, которое взято из таких языков как Lisp (на него WL больше всего похож), Haskell и ML.
Эти самые функции можно удобно между собой комбинировать — вывод одной можно направить на вход другой.

На bash посмотрите.
Т.к. большинство языков тьюринг-полные, то, в принципе, задачу можно решить в любом из них. Различия языков — это, по сути, различия самого процесса разработки. И вот здесь у WL есть несколько уникальных вещей.

Самое главное — это сама парадигма языка «все является символом” и работа с паттернами. На самом деле вы не объявляете функции, а задаете преобразования одних символов в другие. Можно писать программу с любого места, используя еще не реализованые функции (а по сути — используя символы, для которых нет дальнейших правил преобразования).

Когда вы объявляете функцию, скажем, f[x_,y_]:=x+y, эти нижние прочерки там неспроста. Они означают паттерны, которые мы преобразовываем (это нечто большее, чем концепция аргументов функции). Можно задавать дополнительные условия для этих самых входных паттернов. Рассмотрим пример:

MyPlus[x_, y_] := x + y /; x > y
MyPlus[2, 3] := "4, lol"

MyPlus[6, 5]
> 11
MyPlus[5, 6]
> MyPlus[5, 6]
MyPlus[2, 3]
> "4, lol"


Здесь у нас функция, которая складывает числа, но почему-то только если первое больше второго. В противном случае вся конструкция (»вызов функции") остается неизменной и в таком виде используется дальше. А в случае сложения 2 и 3 она вообще говорит неправду. Иными словами, я задал несколько правил преобразования символа MyPlus[_,_] а Математика по мере выполнения выбирает, какое из этих правил использовать, с приоритетом у самого специфичного правила (это не зависит от порядка объявления).

И еще одно — при разработке программы в т.н. блокнотах происходит что-то, что отличается от обычного “изменил код — запустил — проверил”. Код и результаты его работы смешаны вместе в одном интерфейсе (таким образом, который вы зададите). Например, вам нужно модифицировать какую-то функцию — вы можете изменить и выполнить только ее, без перезапуска всей программы, видя результат ее работы прямо там же. При этом будет использован текущий “контекст” (заданные переменные и т.д.). Таким образом, граница между разработкой, исполнением и отладкой стирается, обратная связь мгновенна. Традиционный способ разработки кажется при этом уже не таким удобным.

Есть много интересных вещей, которые из этого следуют, но сложно уместить ответ в рамках комментария.
Поищите в документации к WL запуск функций из библиотек на других языках. Если есть — то берём любую библиотеку, в которой есть возможность запуска TCP-сервера и готово. Далее, попробуйте поискать, есть ли WL возможность использовать BSD sockets или возможность запускать функции из POSIX API (если всё это происходит на UNIX, разумеется). Далее, в WL есть возможность компиляции функций (функция Compile). Компилировать можно двумя способами: либо в специальное внутреннее представление Mathematica, либо в специальный сгенерированный код на C. Попробуйте поискать, можно ли вызывать из WL функции C, в том числе из этого самого кода на C, выдаваемого Compile. И вообще, раз можно из WL запускать сишный код, выданный Compile, значит, должна быть и возможность запустить произвольный сишный код. Далее, собственно, повызывайте сишные функции из BSD sockets
exit = LibraryFunctionLoad["/lib/x86_64-linux-gnu/libc.so.6", "exit", {Integer}, Integer]
exit[0]

Вот таким способом можно вызывать сишные функции из WL (у меня в Mathematica 10 работает). Правда, остальные функции чё-то не работают (sqrt, open, abs и т. д.), но там, наверное, можно разобраться. Итак, этим способом можно вызывать функции socket, connect и т. д., можно вызывать всякие функции из curl и т. д.
UFO just landed and posted this here
На Mac OS, например, было бы так:
WOLFRAM_EXECUTABLE = "/Applications/Mathematica.app/Contents/MacOS/MathKernel"
Sign up to leave a comment.

Articles