2013-08-05 26 views
0

我將如何去增加一個變量,這就是a=0; a++;C的'++`計劃版本

在Common Lisp的我會做到這一點使用incf像這樣:

(setf a 0) (incf a) (print a) 

;=> 0 

;=> 1 

;=> 1 
;=> 1 

但雞的方案似乎並不具有incf功能/宏,我已經使用apropos啄蛋嘗試,但迄今爲止這一切都沒有幫助。

在C,我會增加變量,像這樣:

int a = 0; 
a++; 
printf("%d", a); 

注意,我不想知道如何簡單地暫時1增加a的價值,我想遞增a以便a不再等於0,但等於1

因此,以下是我想要的東西:

(let ((a 0)) (set! a (+ 1 a)) (print a)) 

這裏是什麼,我正在尋找一個例子 - 寫在NewLisp:

(set 'a 0) (++ a) (println a) 

注意 函數/宏需要能夠接受一個帶引號的變量並永久增加該變量的值。因此,它需要等同於下面的C代碼:

a = 0; a++; // a now equals 1 

我只是寫一個宏來做到這一點的雞,但我似乎無法使磁頭或雞的宏的尾巴 - 他們只是沒有任何意義;它們完全不同於普通Lisp宏。

這裏有一個例子宏,我砍死在一起共口齒不清:

(defmacro ++ (sym) (let ((a (gensym "a,sym,"))) 
    `(let* ((,a ,sym)) 
     (setf ,sym (+ 1 ,a)) ,sym))) 

(setf a 0) 

;=> 0 

(++ a) 

;=> 1 

a 

;=> 1 
+0

**注* *如果我不能這樣做'(set!a 0)(SOME-FUNCTION-OR-MACRO a)(print a)'並從'(print a)'返回'1',那麼這不是我想。 –

+0

我編輯了我的答案。檢查。 – ramrunner

+1

Svante的回答是正確的(你應該告訴他爲什麼你認爲它不是),但是如果你不想複製他的宏到你的代碼中,它可以在miscmacros egg中使用(同名,inc! )。這個版本,就像CL中的incf一樣,有一個可選的第二個參數,讓你說增加多少。 –

回答

4

在Scheme中設置東西用set!完成。

(let ((a 0)) 
    (set! a (+ a 1)) 
    (print a)) 

我不是一個陰謀家,但我認爲你可以寫一個宏此類似如下:

(define-syntax inc! 
    (syntax-rules() 
    ((inc! var) 
    (set! var (+ var 1))))) 

,這樣你就可以寫

(inc! a) 
+1

不是我想要的。我想要的東西就像common-lisp的'incf' –

+0

也就是說,如果我不能這樣做(set!a 0)(SOME-FUNCTION-OR-MACRO a)(打印a)'並且返回1從'(打印)',那麼這不是我想要的。 –

+0

又是這樣的:如果你有(SOME-FUNCTION a)一個變量在SOME-FUNCTION正文中變成SHADOWED。如果你明確地改變* global * a,就像在我的例子中那樣,它會起作用。現在你看到斯萬特並沒有創建一個函數,而是一個語法。因此,某些功能與SOME-MACRO非常不同。 – ramrunner

0
(define counter 
     (let ((count 0)) 
      (lambda() 
      (set! count (+ count 1)) 
      count))) 

>(counter) 
1 
>(counter) 
2 

始終保持的封包含在您的副作用的範圍。 計數變量不能逃過let範圍

編輯: 請看下面。 (雖然這正是你應該嘗試什麼,通常會避免!)

> (define a 0) 
> (define inca (lambda() (set! a (+ a 1)))) 
> a 
0 
> (inca) 
> a 
1 

SICP是一個偉大的書。您應該嘗試理解方案中變量的範圍以及它與其他方法的不同之處。作爲雞計劃與這些問題無關。雞是一個很好的R5RS實施,你的問題將適用於所有的方案。

+0

我想讓副作用持續超出增量函數的範圍。我會在我的原始文章中添加更多內容。 –

+0

值得注意的是,對於我當時知道的所有問題,我問了我原來的問題,每一個方案的實現都可能有'++'的變體,*除*雞以外 - 我不知道是否這個問題適用於每一個方案的實施與否,因爲問這樣一個問題超出了我所感興趣的範圍。我只想知道如何在雞方案中做'X';而不是你是否在任何方案中都不能做'X'。 –