Переименование лямбды в Common Lisp

Недавно я начал изучать Common Lisp и (просто для развлечения) решил переименовать макрос лямбда.

Моя попытка была такой:

> (defmacro λ (args &body body) `(lambda ,args ,@body))

Кажется, он правильно расширяется, когда сам по себе:

> (macroexpand-1 '(λ (x) (* x x)))
(LAMBDA (X) (* X X))

Но когда он вложен внутрь выражения, выполнение не удается:

> ((λ (x) (* x x)) 2)
(Λ (X) (* X X)) is not a function name; try using a symbol instead

Возможно, я упускаю что-то очевидное о расширении макроса, но не смог найти, что именно.

Может быть, вы сможете мне помочь?

edit: Это действительно работает с лямбдами:

> ((lambda (x) (* x x)) 2)
4

edit 2: Один из способов заставить его работать (как предложил Rainer):

> (set-macro-character #\λ (lambda (stream char) (quote lambda)))

(проверено в Clozure CL)

11
задан ibab 5 March 2012 в 08:59
поделиться