Итак, Mathematica отличается от других диалектов lisp, потому что он размывает линии между функциями и макросами. В Mathematica, если пользователь хотел написать математическую функцию, скорее всего, они будут использовать сопоставление с шаблоном, например f[x_]:= x*x
вместо f=Function[{x},x*x]
, хотя оба будут возвращать тот же результат при вызове с помощью f[x]
. Я понимаю, что первый подход является чем-то эквивалентным макросу lisp, и по моему опыту предпочтение отдается более сжатому синтаксису.
Итак, у меня есть два вопроса: есть ли разница в производительности между выполнением функций по сравнению с методом сопоставления шаблонов/макросов? Хотя часть меня не удивилась бы, если бы функции были фактически преобразованы в некоторую версию макросов, чтобы позволить реализовать такие функции, как Listable
.
Причина, по которой я волнует этот вопрос, связана с недавним набором вопросов (1) (2) о попытке поймать ошибки Mathematica в больших программах. Если большинство вычислений были определены в терминах "Функции", мне кажется, что отслеживание порядка оценки и возникновение ошибки было бы проще, чем попытка поймать ошибку после того, как вход был переписан последовательным применением макросов/шаблоны.