Гибкость позволяет манипулировать синтаксисом языка.Например, макросы Lisp могут позволить вам писать программы, которые пишут программы и манипулируют вашим синтаксисом во время компиляции для корректных выражений Lisp.Например, Loop Macro:
(loop for x from 1 to 5
do(format t "~A~%" x))
1
2
3
4
5
NIL
И мы можем видеть, как код был переведен с помощью macroexpand-1:
(pprint(macroexpand-1 '(loop for x from 1 to 5
do (format t "~a~%" x))))
Затем мы можем увидеть, как переводится этот макрос:
(LET ((X 1))
(DECLARE (TYPE (AND REAL NUMBER) X))
(TAGBODY
SB-LOOP::NEXT-LOOP
(WHEN (> X '5) (GO SB-LOOP::END-LOOP))
(FORMAT T "~a~%" X)
(SB-LOOP::LOOP-DESETQ X (1+ X))
(GO SB-LOOP::NEXT-LOOP)
SB-LOOP::END-LOOP)))
Гибкость языка просто позволяет вам создавать свой собственный встроенный язык в пределах языка и сокращать длину вашей программы с точки зрения используемых символов.Так что в теории это может сделать язык очень нечитаемым, поскольку мы можем манипулировать синтаксисом.Например, мы можем создать недопустимый код, переведенный в действительный код:
(defmacro backwards (expr)
(reverse expr))
BACKWARDS
CL-USER> (backwards ("hello world" nil format))
"hello world"
CL-USER>
Очевидно, что приведенный выше код может стать сложным, поскольку:
("hello world" nil format)
не является допустимым выражением Lisp.