Для тех немногих сильных духом, кто заинтересовался «псевдо-макросами» в приложении к матмоделям, запилил статью с гораздо более подробными разъяснениями и всевозможной философией по этой теме.
Сделай сам себе язык -- я было подумал, что речь про Fort. В нём действительно решение задачи заключается в написании языка, для которого решение данной задачи тривиально :)
Вот как раз метапрограммирование в форте через жопу.
Был какой-то вариант, в котором в каком-то относительно прямом виде был доступ к дереву выражений. Не помню, как назывался... Вроде бы, подобие лиспа, только не списки, а очереди. Но могу обшибиться. Только там уже не удалось сохранить эту вот "низкоуровневость" форта.
Более универсальным способом этот вопрос решается добавлением замены в $Pre. То есть не определять вообще никаких псевдо-функций, а вместо этого сделать замену по шаблону на этапе предобработки выражения. Но в этом случае почти весь код уже будет отличаться.
Достаточно интересный метод. Правда в подобных прогах на wolfram очень сложно (по крайней мере для меня) не запутаться и не совершить ошибку в Hold, Evaluate, Activate и т.д.. А ведь иногда с этими функциями и ошибка сразу не видна и не очевидно как проверять.
Ну, я для этих целей сделал специальную функцию, которая добавляет в $Pre, заблокировав в процессе добавления предобработку и предварительно проверяя, не добавлена ли уже такая функция. А потом Такие функции добавляю уже через эту. Поскольку, таки да, очень легко где-то что-то перепутать, а потому проще пользоваться однажды проверенной и отлаженной функцией добавления
( ... )
Comments 7
Reply
Был какой-то вариант, в котором в каком-то относительно прямом виде был доступ к дереву выражений.
Не помню, как назывался...
Вроде бы, подобие лиспа, только не списки, а очереди.
Но могу обшибиться.
Только там уже не удалось сохранить эту вот "низкоуровневость" форта.
Reply
Reply
Reply
Reply
$Pre = Function[{ev},
ReplaceRepeated[Unevaluated@ev,
SmartModule[args_] :>
Module[Evaluate@Activate@extarctVars[Hold@args], args]],
HoldAll
]
Достаточно интересный метод. Правда в подобных прогах на wolfram очень сложно (по крайней мере для меня) не запутаться и не совершить ошибку в Hold, Evaluate, Activate и т.д.. А ведь иногда с этими функциями и ошибка сразу не видна и не очевидно как проверять.
Reply
Reply
Leave a comment