gpt4 book ai didi

functional-programming - 在 Racket 中定义错误

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

我几天前才发现 Racket,我正试图通过编写一个小脚本来更熟悉它,该脚本使用 #lang slideshow 生成图像来表示源代码。

我知道在函数范式中编程时,使用 let 创建几乎所有变量是一种很好的做法,但我发现它引入了太多级别的嵌套,而且 Racket 的 let 有一个过于复杂的 API这需要多余的括号。我确信这是为了消除以更强大的方式使用 let 时的歧义,但就我的目的而言,这只是一个烦恼。因此,我正在使用 define 创建所有变量,并在需要时使用 begin 编写 block (例如在 if 的主体中) > 声明)。

问题是我一再收到似乎非常神秘的错误。我确信我只是犯了一些愚蠢的初学者错误,因为我是这门语言的新手,但我似乎真的找不到提示的根源。

这是有问题的代码:

(define sub-code (foldr ht-append (rectangle 0 0) (map internal-style (rest code))))

尽管我们定义的sub-code 似乎无关紧要。如果我将它替换为

(define sub-code '())

我收到同样的错误。 DrRacket 表示 define 正在表达式上下文中使用。我理解这个错误通常意味着什么 - IE,当你编写像 (print (define x 10)) 这样的代码时它会引发,但我在这里看不到什么会触发它。

如果有帮助,这个 define 位于 begin block 的开头,在 if 语句中

(if (list? code)
(begin
(define sub-code '())
; a few more define statements and finally an expression ))

DrRacket 正在打印的具体错误信息是

define: not allowed in an expression context in: (define sub-code (quote ()))

我想也许 define 不允许出现在 begin block 中,但我检查了 the docs begin 的示例之一是

(begin
(define x 10)
x)

所以我真的不知道该怎么办。提前致谢!

最佳答案

在“正文”上下文中允许定义,例如 lambdalet除其他外。 if 的后续和替代条款不是 body 环境;它们是表达式上下文,因此不允许定义。

begin很特别- begin在正文上下文中允许定义,但是 begin在表达式上下文中禁止定义。你的情况属于后者。

例如:

(define (foo . args)     #| body context #|)
(define foo (lambda args #| body context |#))
(define (foo . args)
(let (...)
#| body context |#))

需要表达式的语法关键字:if, cond, case, and, or, when, unless, do, begin .检查任何 Scheme 报告中的正式语法 (r{4,5,6,7}rs);寻找 <body> , <sequence> , <command> , 和 <expression> .

此外,如果您需要在表达式中使用正文上下文,只需将 let 包裹起来句法形式,例如:

(if test
(let ()
(define foo 'foo)
(list foo foo))
alternate)

关于functional-programming - 在 Racket 中定义错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16221336/

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