我是計劃編程的新手,並試圖在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.對不起,我的英文
我是計劃編程的新手,並試圖在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.對不起,我的英文
不像命令式語言,你應該避免不使用define
或set!
更新變量,在那裏你能避免它。在某些情況下,它是需要的,就像發電機一樣。 既然你沒有一個完整的代碼示例,你想這樣做,我看不出什麼明顯的解決方案將被使用。
如果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
也許你可以加點更多的背景,因爲這看起來非常不schemish ;-) – uselpa