gpt4 book ai didi

lisp - (定义...)的嵌套应用程序之间的竞争条件?

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

使用 DrRacket,在 linux 和 Mac OS 上,下面的代码给出了这个错误

*: expects type <number> as 1st argument, given #<undefined>

但是如果我在过程定义的开头取消注释(换行符),它工作正常,产生预期值 9。

#lang r5rs

(define (quadr x y)
;(newline)
(define xx (* x x))
(define yy (* y y))
(define xxyy (* xx yy))
(+ xx yy xxyy))

(display (quadr 1 2))
(newline)

这是 Racket 的方案解释器中的错误,还是指定的语言使得 (define ...) 的嵌套调用可能会乱序发生?如果是后者,我在哪里可以找到语言规范的相关部分?

顺便说一句,我非常了解“let”结构,并且知道这不是定义此类过程的推荐方式。不过,我没想到会出现此错误。

最佳答案

这是相关的link到解释内部定义行为的 R5RS 规范。请注意,在 §5.2.2 节中声明:

... it must be possible to evaluate each <expression> of every internal definition in a <body> without assigning or referring to the value of any <variable> being defined.

换句话说,如果您 define 就不能指望正确的行为以前依赖于 define 的值d 相同内部定义中的值。使用 let*为此:

(define (quadr x y)
(let* ((xx (* x x))
(yy (* y y))
(xxyy (* xx yy)))
(+ xx yy xxyy)))

或者更冗长一点,使用一对嵌套的 let小号:

(define (quadr x y)
(let ((xx (* x x))
(yy (* y y)))
(let ((xxyy (* xx yy)))
(+ xx yy xxyy))))

插入一个 (newline) 很奇怪导致变量定义适用于此示例,但是当您处理未定义的行为时,任何事情都可能发生。作为旁注,如果我使用 #lang racket而不是 #lang r5rs ,原始代码对我有用,没有额外的 (newline) .

关于lisp - (定义...)的嵌套应用程序之间的竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18599665/

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