【发布时间】:2016-03-22 03:34:54
【问题描述】:
我最近开始学习 CL,我想弄清楚是否可以为函数命名空间中的符号设置值。
我只想根据函数组合来定义函数,或者简单地通过现有函数定义函数(例如,我只需要在玩具“Hello,World!”级别项目中重写 identity 两次)。我不确定它是否可能,因为它可能会破坏命名空间分离(至少没有强制执行)。我还尝试macroexpand defun 实际做了什么;作为初学者,这对我来说太神秘了,但它的核心部分似乎是内置的(我正在使用 SBCL)。
例如而不是说:
(defun myfn (x) x)
我宁愿说:
(def..? myfn identity)
如果我不能这样做,我该如何避免此类代码重复? (包括由函数组合创建的函数,而不仅仅是创建同义词)。
【问题讨论】:
-
只是一个想法,您可以添加一个扩展为
(defun myfun (&rest args) (apply identity args))的宏。当然,在 Lisp-1 中,您可以只使用(define myfn identity)。 -
请务必查看从副本链接的一些功能。周围有很多有用的信息。标题为why defun is not the same as (setq
的文章有一些很好的讨论。)? -
另外,为了清楚起见,您可以使用
#'表示法获取符号的函数值。即,你不需要做(let ((id (lambda (x) x))) (compose id ...))。你可以只做(let ((id #'identity)) (compose id ...))或(compose #'identity ...)。
标签: common-lisp