我正在创建一个程序,允许用户引入lambda函数,只将它写在接口写入框中,如下所示:
(lambda (p q) (and (not p) q))
这是结果“(lambda(p q)(和(不是p)q))”因为scheme将它转换为字符串而不是可以评估的过程。
如何将此字符串转换为过程?
答案 0 :(得分:4)
在Scheme中,eval
函数仅对符号列表进行操作,因此可以正常工作:
(eval '(+ 1 2))
但这会产生错误:
(eval "(+ 1 2)")
要将字符串从UI转换为符号列表(AKA和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)