2011-03-21 36 views
1

我有railroad1和station1定義,我想更新鐵路1的價值,而不使用設置!或另一個定義。例如:獲得「set!」的效果沒有使用它

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

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

當我打電話(添加站railroad1 STATION1)我得到

(1991 "station") 

現在我可以這樣做:

(define railroad1 (add-station railroad1 station1)) 

這樣railroad1現在(1991年「站「)而不是(1991)。

然而,我的最終目標是能夠只是調用

(add-station railroad1 station1) 

並沒有如上明確地重新定義railroad1已經railroad1被重新定義爲(1991年「站」),並且不使用一套!無論是。

編輯:set-car!,set-cdr !,以及其他類似的特殊形式也是不允許的。

有沒有辦法做到這一點?

+3

我認爲你誤解了你的功課。有一定的方法來*模型*設置!和突變而不使用它們,但你所描述的設置似乎將它們排除在外。我想如果你允許導入一個宏定義來改變'define'的含義...... – 2011-03-21 05:45:16

+0

在許多方案系統中,define是一個用'set!'代替的宏。 – knivil 2011-03-21 10:01:41

回答

0

是的,如果你被允許使用set-cdr!

(set-cdr! railroad1 station1) 
+1

對不起,我忘了說明:我們不能使用set!,set-cdr!,或set-car!,或任何其他集合的變體!我不知道。 – maccam912 2011-03-21 03:55:46

1

如果您使用let語句,該怎麼辦?這樣你就可以在let中設置railroad1和station1的初始值,然後你可以通過再次調用let來更新它。範圍界定應該讓你的變量從設置「安全」!我很想看到更多的代碼,比如你在第二行中調用的這個函數add-station。

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)) 

,然後執行。

希望這會有所幫助!