获得“集合”的效果!不使用它

时间:2011-03-21 03:14:59

标签: scheme

我定义了railroad1和station1,我想在不使用set的情况下更新railroad1的值!或另一个定义。例如:

(define railroad1 (list 1991))
(define station1 (list "station"))

(define (add-station railroad station)
  (append railroad station)
)

当我打电话时(add-station railroad1 station1)我得到了

(1991 "station")

现在我可以这样做:

(define railroad1 (add-station railroad1 station1))

所以铁路1现在(1991年“站”)而不是(1991年)。

然而,我的最终目标是能够致电

(add-station railroad1 station1)

并且将railroad1重新定义为(1991“站”),而没有如上所述明确重新定义railroad1,并且不使用set!任

编辑:set-car!,set-cdr!和其他类似的特殊表格也是不允许的。

有没有办法做到这一点?

3 个答案:

答案 0 :(得分:1)

如果使用let语句怎么办?这样你就可以在let中设置railroad1和station1的初始值,然后你可以再次调用let来更新它。范围界定应使您的变量“安全”不受设置!我希望看到你编写的更多代码,就像你在第二行中调用的这个函数add-station一样。

答案 1 :(得分:0)

是的,如果您被允许使用set-cdr!

(set-cdr! railroad1 station1)

答案 2 :(得分:0)

这应该有效:

(define-syntax add-station
  (syntax-rules ()
    ((_ railroad station) (define railroad (append railroad station)))))

修改

抱歉,没有注意到家庭作业标签。我会解释答案。

define-syntax生成所谓的。宏的工作方式与普通函数不同。它们不是直接评估操作数,而是直接用宏体替换宏调用。 _中的syntax-rules表示宏的原始名称,即add-station。所以当你打电话时

(add-station railroad1 station1)

直接替换为

(define railroad1 (append railroad1 station1))

然后执行。

希望这有帮助!