gpt4 book ai didi

scheme - 无法对 Racket 中的用户输入使用 eval

转载 作者:太空宇宙 更新时间:2023-11-03 18:37:52 24 4
gpt4 key购买 nike

我目前正在学习 Scheme(使用 Racket),但我面临的挑战之一是尝试执行以下代码,这意味着使用 eval< 从用户输入执行 Racket 代码:

(display (eval (read)))

这是我目前观察到的一些奇怪行为:

  1. (display (eval (read))) 在定义窗口中提示键盘输入,正如预期的那样,当定义运行时。但是,提供输入
    ((lambda (x) (+ x 1)) 1)

    给出错误
    ?: 不允许函数应用;
    没有 #%app 语法转换器绑定(bind)在:((lambda (x) (+ x 1)) 1)

  2. 另一方面,使用(display ((eval (read)) 1)) 并提供输入
    (lambda (x) (+ x 1))

    返回错误
    lambda:未绑定(bind)标识符;
    此外,没有#%app 语法转换器绑定(bind)在:lambda

  3. 但是,运行 (display (eval (read))) 并在控制台 Pane 中提供 ((lambda (x) (+ x 1)) 1),与定义 Pane 相反,按预期打印出 2

这种行为的原因是什么?

最佳答案

您似乎没有设置命名空间。如果您在文件中运行 (eval (read)),它不会工作,因为 current-namespace默认情况下设置为空命名空间。您可以通过首先执行 (current-namespace (make-base-namespace)) 来设置一个带有 racket/base 的命名空间:

#lang racket
(current-namespace (make-base-namespace))
(println (eval (read)))

运行这个程序并给它输入 ((lambda (x) (+ x 1)) 1) 导致它打印 2

它在交互窗口(您的怪异行为列表中的第 3 项)中起作用的原因是在交互窗口中,current-namespace参数设置为文件的命名空间。

这对于主程序的定义窗口是不正确的,所以你必须设置 current-namespace你自己,或者将命名空间作为第二个参数传递给 eval:

#lang racket
(define ns (make-base-namespace))
(println (eval (read) ns))

关于scheme - 无法对 Racket 中的用户输入使用 eval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37246033/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com