2011-02-24 42 views
0

我需要實現一個參數的函數 - obj - 返回一個方案表達式,計算時,將返回obj副本。如何返回對象的副本?

關於如何解決問題的任何想法?

+0

什麼樣的對象你的意思是? – 2011-02-24 10:41:36

+0

爲什麼不只是返回obj?我假定你正在計劃進行破壞性修改。爲什麼不創建一個返回修改副本的函數,然後用續行來包裝它,以便爲您提供所需的行爲? – Marcin 2011-02-24 19:09:39

回答

1

我猜你的意思是寫「功能EXPR,返回[接受的] OBJ [和]返回方案表達式,評估的時候,...」

假如是這樣的話:你真正需要的是設計配方。首先:寫下你的函數接受的例子,以及它返回的內容。這將澄清你正在嘗試做的事情,無論是對他人還是(可能更重要的)對你自己。

希望這是有幫助的;遺憾的是如此不透明......

1

如果你希望你的程序能夠複製任何對象,則目標可能是計劃的basic types.中的任何一個憑藉不同的類型,它們具有不同的「性質, 「或結構,或者你有什麼,因此製作一種類型的對象的副本必然涉及製作不同類型的另一個對象的副本的不同策略。

所以,你如何處理,這是檢查每個計劃的類型(或者說,你關心處理方案的類型的子集),並砌出意味着什麼,複製該類型的對象。如果你這樣做的明顯的方式,你應該結束了一組像拷貝數,複製符號等專門的程序(擾流板:很多這些程序都不會是很有趣的。)

的團結,這些專門的程序到一個單一的一個可以複製你把它降低到確定對象真實的類型和呼喚複製FOO程序做的工作(你還可擴展過程在線)任何對象。你可以用COND和類型確定謂詞真正輕鬆地組織這樣的:「對類型調度」

(define (copy-object obj) 
    (cond ((number? obj) (copy-number obj)) 
     ((boolean? obj) (copy-boolean obj)) 
     ... 
     )) 

這是對數據進行操作,無論其類型稱爲通用設計模式這實際上是一種非常糟糕的方式來進行泛型編程,而不是在這種情況下太重要。

的最後一件事就是返回你可以評估,以獲得副本的事情的增加皺紋。不妨告訴你那是什麼直線上升:封裝調用拷貝對象的無參數的lambda表達式中:

(define (expr-returning obj) 
    (lambda() (copy-object obj))) 

然後,你可以做的東西一樣

 
guile> (define x (list 1 2 3 4)) 
guile> (define y (expr-returning x)) 
guile> (define cx (y)) 
guile> x 
(1 2 3 4) 
guile> cx 
(1 2 3 4) 
guile> (set-cdr! x 'foo) 
guile> x 
(1 . foo) 
guile> z 
(1 2 3 4) 
etc.