【问题标题】:Must the first argument to `eval` be a list?`eval` 的第一个参数必须是一个列表吗?
【发布时间】:2019-08-04 18:22:23
【问题描述】:

Scheme 编程语言说

程序:(eval obj environment)

返回:obj 表示的 Scheme 表达式的值 环境

库:(rnrs eval)

如果obj 不代表语法上有效的表达式,eval 引发条件类型为&syntax 的异常。环境 由environment、scheme-report-environment 和 null-environment 是不可变的。因此,eval 也会引发一个 如果分配给任何 环境中的变量出现在表达式中。

(define cons 'not-cons)
(eval '(let ([x 3]) (cons x 4)) (environment '(rnrs)))   (3 . 4)
(define lambda 'not-lambda)
(eval '(lambda (x) x) (environment '(rnrs)))   #<procedure>
(eval '(cons 3 4) (environment))  exception

obj 到 eval 的第一个参数必须是一个列表吗?

【问题讨论】:

    标签: list scheme racket


    【解决方案1】:

    不,原子也可以被评估。例如,在球拍中:

    #!r6rs
    
    (import (rnrs base (6))
            (rnrs eval (6))
            (rnrs io simple (6)))
    
    (define env (environment '(rnrs)))
    
    (display (eval 42 env))
    => 42
    (display (eval #t env))
    => #t
    (display (eval "xyz" env))
    => "xyz"
    

    【讨论】:

    • eval 的第一个参数可以是什么?
    • 如文档中所述:Scheme 中的任何语法上有效的表达式。基本上是列表和原子。如果我们超出标准,在 Racket 中我们还可以eval 向量、哈希等。
    • Scheme 中的原子是什么? atom 只是 Racket 的概念吗?
    • 不,这是一个松散定义的 Lisp 概念。请参阅此 post 及其 cmets。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 2020-06-26
    • 1970-01-01
    • 2020-03-29
    • 2018-08-29
    • 1970-01-01
    • 2023-01-16
    相关资源
    最近更新 更多