Недавно я написал макрос cl именно для этой цели, он может вам пригодиться. Это называется ugly-tiny-infix-macro.
Вы можете записать рассматриваемое выражение как:
($ a * ($ 8 * (expt b 2) + 1) + 4 * b * c * ($ 4 * (expt b 2) + 1))
Он расширен до
(+ (* A (+ (* 8 (EXPT B 2)) 1)) (* (* (* 4 B) C) (+ (* 4 (EXPT B 2)) 1)))
Объяснение: $ - это имя макроса. Аргументы рассматриваются как список выражений и, следовательно, широкое использование пробелов для отделения чисел / форм от символов, обозначающих операторы.
Рассмотрим следующие примеры, чтобы лучше понять функцию этого макроса:
($ 1 + 2) ; gets converted to (+ 1 2), where name of the macro is $
($ t and nil) ; gets converted to (and t nil)
($ 3 > 5) ; gets converted to (> 3 5)
($ 1 + 2 + 3) ; gets converted to (+ (+ 1 2) 3)
($ 1 + 2 * 3) ; gets converted to (+ 1 (* 2 3))
($ 1 < 2 and 2 < 3) ; gets converted to (AND (< 1 2) (< 2 3))
Все, что находится в круглых скобках в позиции операнда, рассматривается как форма шепелявости.
($ 2 + (max 9 10 11)) ; gets converted to (+ 2 (max 9 10 11)). It could have been any function / lisp form.
($ 6 / ($ 1 + 2)) ; gets converted to (/ 6 ($ 1 + 2)), and then subsequently to (/6 (+ 1 2))
Я считаю, что это легче рассуждать и более выгодно, чем макрос чтения, поскольку он может легко смешиваться с формами lisp, поэтому вы можете вкладывать формы lisp в выражение. Например, (exp b 2)
мог быть любой формой lisp, например (max a b c)
или вашим собственным (foobar a b c)
, заданным пользователем.
Дополнительную информацию можно найти в README на github. Это также доступно на quicklisp.
person
Peeyush Kushwaha
schedule
10.07.2016