我对defun宏如何工作感到困惑,因为
(defun x () "hello")
Run Code Online (Sandbox Code Playgroud)
将创建函数x,但符号x仍将是未绑定的.
如果我将一些lambda绑定到x,那么x将有一个值,但它不会被解释器视为函数,如下所示:
(x)
Run Code Online (Sandbox Code Playgroud)
我认为这与defun应该在全球环境中定义功能这一事实有关,但我不确定它究竟意味着什么.为什么我不能在当前环境中影响它呢?
有没有办法强制解释器将符号视为函数,如果某个lambda绑定到它?例如:
(setq y (lambda () "I want to be a named function"))
(y)
Run Code Online (Sandbox Code Playgroud)
PS:我正在使用SBCL.
我想print在变量中存储一个函数,这样我就可以输入一些简短的函数p,例如:
In Scheme:
(define print display)
(print "Hello world\n")
;; alternate way
(define print 'display)
((eval print) "Hello world\n")
Run Code Online (Sandbox Code Playgroud)
同样的方法似乎不起作用Common Lisp:
(defvar p 'print)
;;(print (type-of p))
(p "Hello world") ;; Attempt 1
((eval p) "Hello world") ;; >> Attempt 2
((eval (environment) p) "Hello world") ;; Attempt 3
Run Code Online (Sandbox Code Playgroud)
我Attempt 1上面得到这个错误:
*** - EVAL: undefined function P
Run Code Online (Sandbox Code Playgroud)
而这与Attempt 2和3在Clisp:
*** - EVAL: (EVAL (ENVIRONMENT) P) …Run Code Online (Sandbox Code Playgroud) 我最近开始学习CL,我试图找出是否可以在函数名称空间中为符号设置值.
我想根据函数组合定义函数,或者只是通过现有函数定义函数(例如,我只需要identity在玩具"Hello,World!"级项目中重写两次).我不确定它是否可能,因为它可能会破坏命名空间分离(至少没有强制执行).我也尝试过实际做的macroexpand事情defun; 作为一个初学者,它对我来说太神秘了,但似乎内置的核心部分(我正在使用SBCL).
所以,例如,而不是说:
(defun myfn (x) x)
Run Code Online (Sandbox Code Playgroud)
我宁愿说:
(def..? myfn identity)
Run Code Online (Sandbox Code Playgroud)
如果我不能这样做,我怎么能避免这类代码重复?(包括由函数组合创建的函数,而不仅仅是创建同义词).