将字符串转换为过程

Car*_*ess 2 string lambda scheme

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

(lambda (p q) (and (not p) q))
Run Code Online (Sandbox Code Playgroud)

这是结果 "(lambda (pq) (and (not p) q))" 因为 scheme 将其转换为字符串而不是可以评估的过程。

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

Dan*_*ile 5

在 Scheme 中,该eval函数只对符号列表进行操作,所以这可以正常工作:

(eval '(+ 1 2))
Run Code Online (Sandbox Code Playgroud)

但这会报错:

(eval "(+ 1 2)")
Run Code Online (Sandbox Code Playgroud)

要将 UI 中的字符串转换为符号列表(也称为 S 表达式),您需要调用该read函数。通常,read仅对“端口”(文件流)进行操作,因此您需要将字符串转换为输入端口,然后才能使用read

(define (read-string text)
  (read
    (open-input-string text)))
Run Code Online (Sandbox Code Playgroud)

剩下的就是评估字符串,并调用你得到的 lambda 表达式:

(define (call-string text-lambda . args)
  (apply
    (eval (read-string text-lambda))
    args))
Run Code Online (Sandbox Code Playgroud)

以下是您现在可以计算数字 3 的方法:

(call-string "(lambda (a b) (+ a b))" 1 2)
Run Code Online (Sandbox Code Playgroud)

您可以在R5RSSRFI网站上找到适用于read和的 API 。open-input-string