gpt4 book ai didi

input - 在 Common Lisp 中从键盘读取 lambda 表达式

转载 作者:行者123 更新时间:2023-12-02 09:15:35 27 4
gpt4 key购买 nike

我希望能够从键盘读取 lambda 表达式。例如,如果函数方 block 已被 DEFUNed,我可以输入符号名称:

(defun square (x) (* x x))

这样当评估以下内容时:

(funcall (read) 2)

用户可以输入 square,结果是 4。但是如果用户输入

(lambda (x) (* x x))

结果是一个错误,例如在 Macintosh Common Lisp 中,

Error: (LAMBDA (X) (* X X)) can't be FUNCALLed or APPLYed

有没有一种简单的方法可以做到我所缺少的?

谢谢。

最佳答案

read返回 list必须先对其进行评估,然后才能 funcall编辑。

这可以使用 read-time evaluation 来完成:

(funcall (read) 2)
#.(lambda (x) (* x x))
==> 4

但是,一般来说,这是一个安全漏洞(您正在评估用户提供的代码 - 如果他们输入 #.(start-nuclear-war) 会怎样?),因此谨慎的工程师会绑定(bind)*read-eval*读取输入时他们无法控制nil

因此,使用 coerce 会更好。明确:

(funcall (coerce (let ((*read-eval* nil)) (read)) 'function) 2)
1+
==> 3
(funcall (coerce (let ((*read-eval* nil)) (read)) 'function) 2)
(lambda (x) (* x x))
==> 4

关于input - 在 Common Lisp 中从键盘读取 lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56581829/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com