如何在Scheme中实现将λ定义为lambda的别名?
问题解答
为什么普通define无法给lambda创建别名
普通define仅支持给普通值、函数创建别名,而lambda属于语言内置的语法关键字(特殊形式),不属于普通变量绑定范畴,因此直接写(define λ lambda)不会生效。
通用解决方案(适配绝大多数Lisp/Scheme方言)
通过定义语法宏的方式把λ的行为完全映射到lambda,只需要在你代码的开头加入如下宏定义即可:
(defmacro λ (&rest body) `(lambda ,@body))
添加后你给出的示例代码就可以正常运行,和原生lambda的使用效果完全一致:
(define add (λ args-list (apply + args-list)))
不同方言的优化方案
- Racket:默认原生支持
λ作为lambda的别名,不需要额外配置直接使用即可 - Common Lisp:可以通过设置读宏实现零开销的别名,效果和直接写
lambda完全等价:(set-macro-character #\λ (lambda (stream char) (declare (ignore char stream)) 'lambda)) - Scheme(R6RS/R7RS标准):可以用标准语法规则定义更严谨的绑定:
(define-syntax λ (syntax-rules () ((_ args body ...) (lambda args body ...))))
内容的提问来源于stack exchange,提问作者Duncan Britt
相关产品推荐
相关产品推荐

