gpt4 book ai didi

scheme - 定义带括号和不带括号的名称之间的语义区别是什么?

转载 作者:行者123 更新时间:2023-12-02 06:58:31 27 4
gpt4 key购买 nike

(虽然这确实是一个简单的问题,但我发现有时这是我作为初学者在编写 Scheme 程序时常犯的错误。)

我对 define 特殊形式遇到了一些困惑。情况如下:

(define num1
2)

(define (num2)
2)

我发现调用 num2 时不带括号并且程序失败的情况经常发生。我通常最终会花费数小时来查找原因。

通过阅读 r5rs,我意识到没有括号的定义,例如num1, 是一个变量; while 带括号的定义,例如num2, 是一个没有形参的函数。

但是,我仍然不清楚“变量”和“函数”之间的区别。

从 emacs lisp 背景来看,我只能将上述差异与 emacs lisp 中的类似想法联系起来:

In Emacs Lisp, a symbol can have a value attached to it just as it can have a function definition attached to it. [here]

问题:这是理解方案中封闭定义和非封闭定义之间区别的正确方法吗?

最佳答案

Scheme 中的值和函数没有区别。函数只是一个可以以特定方式使用的值 - 它可以被调用(与其他类型的值相反,例如数字,它不能被调用,但可以例如添加,而函数不能)。

圆括号只是一种语法快捷方式 - 它们是一种更快、更易读(对专家而言)的将名称定义写成包含的变量的方式一个函数:

(define (num)
2)

;is exactly the same as

(define num
(lambda () 2) )

其中的第二个应该使分配给 num 的值不是数字在视觉上更加明显。

如果您希望函数接受参数,它们要么放在括号内(num 之后,例如第一种形式的 (num x y)),要么在 lambda 的括号(例如第二个 (lambda (x y)...

大多数针对初学者的教程实际上并没有为几个练习介绍第一种形式,目的是强调它不是独立的并且没有真正提供任何真正的功能在其自己的。这只是减少程序文本中重复次数的简写。

在 Scheme 中,所有函数都是值;变量持有任何一个值。

关于scheme - 定义带括号和不带括号的名称之间的语义区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26443756/

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