Сделай сам себе язык

Nov 13, 2020 19:42

Для тех немногих сильных духом, кто заинтересовался «псевдо-макросами» в приложении к матмоделям, запилил статью с гораздо более подробными разъяснениями и всевозможной философией по этой теме.


Read more... )

наука, философия, xx2 век, программирование

Leave a comment

Comments 7

macropisec November 13 2020, 18:45:11 UTC
Сделай сам себе язык -- я было подумал, что речь про Fort. В нём действительно решение задачи заключается в написании языка, для которого решение данной задачи тривиально :)

Reply

nivanych November 14 2020, 10:13:09 UTC
Вот как раз метапрограммирование в форте через жопу.

Был какой-то вариант, в котором в каком-то относительно прямом виде был доступ к дереву выражений.
Не помню, как назывался...
Вроде бы, подобие лиспа, только не списки, а очереди.
Но могу обшибиться.
Только там уже не удалось сохранить эту вот "низкоуровневость" форта.

Reply


babayagga November 29 2020, 18:44:48 UTC
да

Reply


dobriy24 April 28 2023, 21:31:57 UTC
Крутая статья ( ... )

Reply

lex_kravetski April 29 2023, 14:08:45 UTC
Более универсальным способом этот вопрос решается добавлением замены в $Pre. То есть не определять вообще никаких псевдо-функций, а вместо этого сделать замену по шаблону на этапе предобработки выражения. Но в этом случае почти весь код уже будет отличаться.

Reply

dobriy24 April 29 2023, 16:06:06 UTC
А, т.е., написать что-то типа
$Pre = Function[{ev},

ReplaceRepeated[Unevaluated@ev,
SmartModule[args_] :>
Module[Evaluate@Activate@extarctVars[Hold@args], args]],

HoldAll
]

Достаточно интересный метод. Правда в подобных прогах на wolfram очень сложно (по крайней мере для меня) не запутаться и не совершить ошибку в Hold, Evaluate, Activate и т.д.. А ведь иногда с этими функциями и ошибка сразу не видна и не очевидно как проверять.

Reply

lex_kravetski April 29 2023, 20:17:34 UTC
Ну, я для этих целей сделал специальную функцию, которая добавляет в $Pre, заблокировав в процессе добавления предобработку и предварительно проверяя, не добавлена ли уже такая функция. А потом Такие функции добавляю уже через эту. Поскольку, таки да, очень легко где-то что-то перепутать, а потому проще пользоваться однажды проверенной и отлаженной функцией добавления ( ... )

Reply


Leave a comment

Up