2016-11-16 9 views
0

Schemeで引数を取らない関数を作成する方法を知っている人は誰でも知っていますが、呼び出されるたびに呼び出し回数に応じて0または1を返します。たとえば、1回目は1、2番目の0、3番目の1などを返します。SchemeのFlip関数

私は関数内でローカル変数を使用する必要があると思いますが、正確にはわからないので値を変更します毎回私はそれを呼びます。

+2

何を試してみましたか?いくつかのサンプルデータ/コード/出力を投稿して、あなたのために働いていないものを教えてください。また、このリンクをチェックしてください:stackoverflow.com/help/mcve。 – CGritton

+0

私はこれを試しましたが、うまくいきません: (lambda()( (set!x( - 1 x)) (if(= x 0) (1) (0) ))))) –

答えて

1

あなたはあなたの機能をどのように呼んでいるのか言っていません。 make-flipが返ってきたラムダとして機能を定義しましたか?私はこれが「閉鎖101を作っている」と思いますが、私が思い出したことは初めてです。とにかく、私はこの方法を試してみました、動作するように見えた:

(define (make-flipper) 
    (let ((flip 0)) 
    (lambda() 
     (set! flip (if (= flip 0) 1 0)) 
     flip))) 

(define doit (make-flipper)) 

(doit) 
(doit) 
(doit) 

1で--results、その後、0、そして1私はあなたはそれが0で開始したい場合は、LETの値を変更することができると思います。

0

括弧が大量に使用されているためコードが機能しないため、コードでプロシージャではない「プロシージャ」が呼び出されます。

あなたのコード、手順は(0)(1)を呼び出し、それも(Schemeは無視することはありませんいずれかの方法を括弧シーケンス

(set! x (- 1 x)) 
(if (= x 0) (1) (0))) 

の結果を「呼び出す」しようとする

(define (make-flip) 
    (let ((x 1)) 
    (lambda() 
     ((set! x (- 1 x)) 
     (if (= x 0) (1) (0)))))) 

試みは、 )他の言語があります。

これらを修正すると、

(define (make-flip) 
    (let ((x 1)) 
    (lambda() 
     (set! x (- 1 x)) 
     (if (= x 0) 1 0)))) 

です。

条件はあなたにも

(define (make-flip) 
    (let ((x 0)) 
    (lambda() 
     (set! x (- 1 x)) 
     x))) 

を言うと同じ結果を得ることができます、しかし必要はありません。

0

あなただけのこの種の1つの手順が必要な場合は、次のように、あなたも行うことができます。

(define flip 
    (let ((x 1)) 
    (lambda() 
     (begin0 
     x 
     (set! x (- 1 x)))))) 

テスト:あなたは

> (flip) 
1 
> (flip) 
0 
> (flip) 
1 
> (flip) 
0