1

使用 DrScheme(语言——相当大)。试图将表达式的结果传递给稍后可以在另一个表达式中使用的变量。这是问题的简化版本:

定义窗口:

(define (tot a b c) (+ a b c))

(define (tot2) (+ (tot a b c) 1))

解释器窗口

> (tot 5 6 7)

18

> (tot2)

.   . reference to undefined identifier: a

我想要的结果当然是 19。让 DrScheme 一次完成所有代数很容易,但我需要让它求解第一个表达式,然后根据第一个表达式的结果求解第二个表达式。

4

5 回答 5

4

这是你想要的?

(define (tot a b c) (+ a b c))
(define (tot2 a b c) (+ (tot a b c) 1))

然后

(tot2 5 6 7)

应该是 19。


如果要将 tot2 分配给整数值而不是函数,

(define (tot a b c) (+ a b c))
(define tot2 (+ (tot 5 6 7) 1))

将表达式的结果分配给(+ (tot 5 6 7) 1)名称tot2

于 2009-12-17T05:55:00.033 回答
3

Scheme 是词法范围的: so ab,并且c只存在于 的动态范围内tot

过程调用的动态范围是调用发起和返回(通过gnu)之间的时间段。

于 2009-12-17T19:33:21.210 回答
2

您正在想象一种不存在的“持久性”,尽管考虑到先前的数学经验,这可能是合理的。

也就是说:如果我正在解决一个数学问题,并且我说 x 等于 5,那么对于问题的其余部分,x 应该保持等于 5;例如,直到我擦掉电路板。

那么,你能写出这样的编程语言吗?是的!事实上,我可以在 DrScheme 中为您编写一个小宏,它会产生您正在寻找的行为:它将设置一个全局变量表,以便每个变量绑定都会导致对这个变量表的更新。

但!我调查的所有程序员(一个)(好吧,是我)都同意这是一个非常糟糕的主意。

要了解原因,假设我有一个包含多个名为“a”的变量的大型程序。然后,任何时候程序的 A 部分中的某个人调用一个带有名为“a”的变量的函数,那么程序的 B 部分将突然改变其行为。这将使得几乎不可能对大型程序的行为进行推理。

更一般地说,这是“状态”和“突变”的问题。

因此,您不能引用“范围内”以外的变量。也就是说,那些其绑定形式(在本例中为“定义”)包含引用的变量。

于 2009-12-17T17:29:18.317 回答
0

根据您对约翰回答的评论,我认为您想要的只是将每个函数调用的结果分配给一个变量(每个变量一个变量或将它们全部放在一个列表中),然后将这些结果加在一起。

于 2009-12-18T19:02:56.227 回答
0

在阅读了每个人的评论后,我意识到我混淆了两个问题:让解释器评估带有变量的表达式,以及实际为这些变量提供值。由于这种混乱,我问的问题没有意义。这是解决方案的简化版本。如您所见,它非常简单——我只是使用“读取”让用户输入值。

(define a (read))
(define b (read))
(define c (read))
(define d (read))
(define ee (read))
(define f (read))
(define tot (+ a b c))
(define tot2 (+ d ee f))
(define grandtotal (+ tot tot2))
(display grandtotal)

我在实际程序中使用了这种方法,现在有一个很好的小应用程序,可以计算我一周的工作时间。感谢大家耐心的帮助。

于 2009-12-20T04:19:41.057 回答