2012-12-04 25 views
1
(define [DML vara] 
    (cond 
    ((atom? (car vara)) 
     (cond 
     ((eqan? (car vara) 'N) 
     (display (cdr vara))) 
     (else (negate vara))) 

    ))) 

我目前正在試圖挽救回的內容,現在爲了簡單起見,我在測試的否定功能爲「返回」名單,我想救該功能的結果做測試。我如何實際保存從否定列表返回。 類似(x =(negate vara))其中x是列表。我看起來讓谷歌和堆棧溢出,但我找不到一個非常簡單的基本任務。方式存儲功能的結果,(讓)

原諒我的計劃,我只是starting..and從命令式語言去功能不好的語法也不是那麼順暢..

編輯:

我想打印出來的結果表達式(否定vara),但由於計劃只打印出最後一次「遞歸調用」(請原諒我的錯誤措辭)。我想它使用來自(否定翻)所產生的名單,但仍然打印出清單像

say if I had 
(else (test (negate vara))) 
... 
(define (test vara) 
(display "test") 
) 

I wanted it to display 
'(O a b)) ;list 
here 
+0

僞代碼不清楚。你爲什麼不用你選擇的另一種編程語言編寫一個完整的_working_例子(意思是:編譯並實際運行的例子)? –

回答

0

正如你已經知道,一個let表達將這樣的伎倆:

(let ((x 10) 
     (y 20)) 
    (+ x y)) 

=> 30 

上述表達式將值綁定到兩個變量,xy。這些綁定將存在於let的內部。隱含地,let表單中的所有表達式都包含在begin之內,並且整個表達式的最終結果是最終表達式。請注意,一個綁定不能引用定義部分中的其他綁定;如果一個變量需要參考以前的定義,然後用let*

(let* ((x 10) 
     (y (* x 2))) 
    (+ x y)) 

=> 30 

最後,如果你需要創建一個遞歸定義使用letrec

(letrec ((fact (lambda (x) 
       (if (zero? x) 1 (* x (fact (sub1 x))))))) 
    (fact 10)) 

=> 3628800 
+0

嗯,那麼如何將30保存到一個新的列表中,我可以稍後調用like(dispaly z)來顯示更新的內容? –

+0

你爲什麼不在那裏展示結果?請記住:'let'中的變量只存在於它的主體範圍內,與定義範圍的其他編程語言相同。如果您在問題中顯示您想要做什麼_exactly_,可以使用僞代碼或另一種編程語言中的代碼來展示您的觀點,這會非常有用。 –

+1

另外注意,如果你想把結果保存到'let'外面的某個列表中,你將需要可變狀態,雖然這是可能的,但它不會是一種精神上的函數編程風格的方法的計劃。也許你應該重新評估你的方法,並將其調整爲功能風格。 –

0

像你提出你可以做一個程序:

(define (test var) 
    (display var) 
    var) 
(test (negate (test vara)))) ; prints our argument and return 

或者您可以使用DrRacket並使用調試器。使用一次後你會錯過!