我定义了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!和其他类似的特殊表格也是不允许的。
有没有办法做到这一点?
答案 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))
然后执行。
希望这有帮助!