string - 将字符串转换为过程

标签 string lambda scheme

我正在创建一个程序,允许用户引入 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)

您可以在 R5RS 找到用于 readopen-input-string 的 API。和 SRFI网站。

关于string - 将字符串转换为过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7170162/

相关文章:

string - 求 K 的最大值,使得子序列 A 和 B 存在且满足上述条件

java - 在字符串中查找特定的特殊字符

arrays - Angular2使用管道基于对象数组过滤对象数组

java - _(下划线)是保留关键字

c# - 使用 Func 捕获类属性

python - Python 和 Scheme 在变量作用域上有什么区别?

java - 仅从字符串中检索给定的单词

c# - 如何逃脱 '\'

scheme - 这个过程是递归的还是迭代的(长尾递归)?

scheme - 小阴谋家 : What is a function or argument's structure?