2013-11-02 32 views
0

我是計劃編程的新手,並試圖在if條件中定義var。例如,我有:計劃如何在if條件中定義var

(if (< x y) (define x y)) ;(GOAL: if x < y, than x=y..) 

但我得到的錯誤:

let: bad syntax (not an identifier and expression for a binding) in:... 

任何想法如何解決這個問題,將不勝感激。

p.s.對不起,我的英文

+2

也許你可以加點更多的背景,因爲這看起來非常不schemish ;-) – uselpa

回答

0

使用define是錯誤的;你沒有在這裏定義一個函數。解決辦法有兩個:

(if (< x y) (set! x y) (void)) ; if x < y set x = y; else do nothing 

或者

(set! x (if (< x y) y x))  ; sets x to y if (x<y) is true; else sets x to x 
+2

'define'可用於任何約束力,不僅功能 – uselpa

+0

一套!做的工作:),謝謝 – NoSense

+0

在R6RS計劃中的替代方案是可選的,所以'(如果( Sylwester

2

不像命令式語言,你應該避免不使用defineset!更新變量,在那裏你能避免它。在某些情況下,它是需要的,就像發電機一樣。 既然你沒有一個完整的代碼示例,你想這樣做,我看不出什麼明顯的解決方案將被使用。

如果let或遞歸來存儲中間值的方式:

;; within the let block x shadows the original x 
;; with the smalles of the outer x and y 
(let ((x (if (< x y) x y))) 
    (do-something x)) 

您可以通過let*

(let* ((tmp (+ x y)) 
     (tmp2 (* tmp y))) ; tmp is bound here 
    (do-something-with tmp2)); or tmp and tmp2 

您可以使用遞歸,在那裏你在更新CUR和LST做一些中間體通過遞歸得到的第一個innner程序:

(define (mmin x . xs) 
    (define (min-aux cur lst) 
    (cond ((null? lst) cur) 
      ((<= cur (car lst)) (min-aux cur (cdr lst))) 
      (else (min-aux (car lst) (cdr lst))))) 

    (min-aux x xs)) ; start recursion 

這是一個錯誤define已定義東西,所以這就是爲什麼我定義

如果你需要做這個頂層,您可以:

(define min_xy (if (< x y) x y)) 

min_xy。要改變結合破壞性(得到它引用另一個值),可以使用set!

(set! x (+ x 1)) ; increases x 

你會改變大多數地方的定義,它是一個錯誤,如果它doesnæt已經存在。這可以用於創建發電機:

(define (generator start alter-proc) 
    (lambda()       ; returns a procedure taking 0 arguments 
    (let ((old start))     ; temporary store what start points to 
     (set! start (alter-proc start)) ; change what the local start points to 
     old)))       ; return the old value  

(define counter (generator 1 (lambda (x) (+ x 1)))) 
(counter) ; ==> 1 
(counter) ; ==> 2 

(define doubler (generator 1 (lambda (x) (* x 2)))) 
(doubler) ; ==> 1 
(doubler) ; ==> 2 
(doubler) ; ==> 4 
+0

我明白不鼓勵'set!' - 但不能'define',它與'let'一樣只是讓你創建一個綁定。實際上在Racket中'define'通常被鼓勵與'let'減少「向右漂移」縮進。但即使你不喜歡_preferring_'define'這種風格,我也不明白_discouraging_它嗎? –

+0

@GregHendershott我推薦它只是爲了更新綁定。許多實現支持這種使用,即使它不正確Scheme。使用'define'來定義全局變量或程序(它作爲'letrec'工作)當然可以。 – Sylwester

+0

感謝您的回答和解釋:) – NoSense