我正在创建一个程序,允许用户引入 lambda 函数,只需将其写入界面编写框中,如下所示:
(lambda (p q) (and (not p) q))
这是结果“(lambda (p q) (and (not p) q))”,因为 schema 将其转换为字符串而不是可以计算的过程。
如何将此字符串转换为过程?
最佳答案
在Scheme中,eval
函数仅对符号列表进行操作,因此这可以正常工作:
(eval '(+ 1 2))
但这会产生错误:
(eval "(+ 1 2)")
要将 UI 中的字符串转换为符号列表(也称为 S 表达式),您需要调用 read
函数。通常,read
仅在“端口”(文件流)上运行,因此您需要将字符串转换为输入端口,然后才能与 read
一起使用:
(define (read-string text)
(read
(open-input-string text)))
剩下的就是计算字符串,并调用结果得到的 lambda:
(define (call-string text-lambda . args)
(apply
(eval (read-string text-lambda))
args))
下面是计算数字 3 的方法:
(call-string "(lambda (a b) (+ a b))" 1 2)
关于string - 将字符串转换为过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7170162/