相关疑难解决方法(0)

为什么defun与(setq <name> <lambda>)不一样?

我对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.

lisp sbcl common-lisp

20
推荐指数
2
解决办法
1870
查看次数

如何在Lisp中的变量中存储函数并使用它

我想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 23Clisp:

*** - EVAL: (EVAL (ENVIRONMENT) P) …
Run Code Online (Sandbox Code Playgroud)

scheme eval common-lisp first-class-functions lisp-2

2
推荐指数
3
解决办法
2634
查看次数

我可以通过它的值在函数名称空间中定义一个函数吗?

我最近开始学习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)

如果我不能这样做,我怎么能避免这类代码重复?(包括由函数组合创建的函数,而不仅仅是创建同义词).

common-lisp

2
推荐指数
1
解决办法
106
查看次数

标签 统计

common-lisp ×3

eval ×1

first-class-functions ×1

lisp ×1

lisp-2 ×1

sbcl ×1

scheme ×1