将字符串转换为过程

时间:2011-08-24 03:40:09

标签: string lambda scheme

我正在创建一个程序,允许用户引入lambda函数,只将它写在接口写入框中,如下所示:

(lambda (p q) (and (not p) q))

这是结果“(lambda(p q)(和(不是p)q))”因为scheme将它转换为字符串而不是可以评估的过程。

如何将此字符串转换为过程?

1 个答案:

答案 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)

您可以在R5RSSRFI网站找到readopen-input-string的API。