Tôi bắt đầu học Common Lisp gần đây, và (chỉ để cho vui) quyết định đổi tên macro lambda.Đổi tên lambda trong Common Lisp
nỗ lực của tôi là thế này:
> (defmacro λ (args &body body) `(lambda ,args ,@body))
Dường như để mở rộng một cách chính xác khi tự:
> (macroexpand-1 '(λ (x) (* x x)))
(LAMBDA (X) (* X X))
Nhưng khi nó được lồng vào bên trong một biểu thức, thực hiện thất bại:
> ((λ (x) (* x x)) 2)
(Λ (X) (* X X)) is not a function name; try using a symbol instead
Tôi có thể thiếu một cái gì đó rõ ràng về việc mở rộng vĩ mô, nhưng không thể tìm ra nó là gì.
Có thể bạn có thể giúp tôi?
chỉnh sửa: Nó làm việc với lambda:
> ((lambda (x) (* x x)) 2)
4
chỉnh sửa 2: Một cách để làm cho nó hoạt (theo đề nghị của Rainer):
> (set-macro-character #\λ (lambda (stream char) (quote lambda)))
(thử nghiệm trong Clozure CL)
Nó không phải là 'hàm' trong việc mở rộng' lambda', đó là một vấn đề, đó là hành vi có dây cứng của các ứng dụng hàm với 'lambda'. Vì vậy, trong lời giải thích của bạn tôi sẽ thay đổi: "Một biểu thức lambda được áp dụng cũng hợp lệ" thành "Biểu thức' lambda' được áp dụng cũng hợp lệ (chỉ cho 'lambda' và không cho các macro mở rộng đến nó)". –
Bây giờ, cảm giác thật tuyệt vời! Vì vậy, không có cách nào để có được (λ ...) để mô phỏng một biểu thức lambda? – ibab
@qrl: cú pháp ((λ (x) ...) 4) là có thể với một macro đọc trong các triển khai CL hỗ trợ ký tự đó. Người đọc Lisp sẽ phải mở rộng λ vào LAMBDA. –