2012-02-20 7 views
3
(define (even-odd x) 
(if (==(% x 2) 0) (1) (0))) 

私は(5偶奇)を呼び出す 私はこのメッセージなぜSchemeでバインドされていない変数エラーが発生するのですか?

;Unbound variable: % 
;To continue, call RESTART with an option number: 
; (RESTART 11) => Specify a value to use instead of %. 
; (RESTART 10) => Define % to a given value. 
; (RESTART 9) => Return to read-eval-print level 9. 
; (RESTART 8) => Return to read-eval-print level 8. 
; (RESTART 7) => Return to read-eval-print level 7. 
; (RESTART 6) => Return to read-eval-print level 6. 
; (RESTART 5) => Return to read-eval-print level 5. 
; (RESTART 4) => Return to read-eval-print level 4. 
; (RESTART 3) => Return to read-eval-print level 3. 
; (RESTART 2) => Return to read-eval-print level 2. 
; (RESTART 1) => Return to read-eval-print level 1. 

を取得し、デバッガを起動しますか? (yまたはn):

私はエドウィンでテキストを選択する方法を教えてください。

+0

質問は「==」と「%」はすべての言語で同じです普遍的な意味を持っていることを前提としています。あるいはさらに良いは、組込みプロシージャeven?を使用しています。しかし、そうではありません。 – dyoo

答えて

4

ここではいくつか問題があります。つまり、あなたが呼び出しようとしている手順の名前に間違っているということです。 、zvrbaが指摘したようにmodulo

  • ==eqv?
  • でなければなりません

    • %をする必要がありますあなたは、単に数があるかどうかを伝えるためにしようとしている場合は、0と1

    かを囲む括弧を削除偶数または奇数の場合、これを行うためのよりシンプルでクリーンな方法は、組み込みのeven?を使用することです。

    (even? 5) 
    > #f 
    

    またはあなたが実際に結果として0と1をしたい場合は、クリーナー式は

    (if (even? x) 1 0) 
    
  • 3

    戻り値(1と0)の前後にかっこを省略する必要があります。あなたが書いたものは、1と0という名前のプロシージャーを呼び出そうとします。また、モジュラス演算子は%ではありませんが、それ以外の名前が付けられています。私はそれを忘れました - おそらくmodまたはrem]。

    +0

    paranthesisを削除した後も同じエラーが発生します –

    +1

    モジュラス演算子は 'モジュロ 'です。さらに、 '=='は演算子ではありません - あなたは 'eq? 'を使いたいです – dagoof

    +0

    @ dagoof thanks ..また、' == 'を' = ' –

    3

    これはeven-oddプロシージャを記述するより慣用的な方法である可能性があり:

    (define (even-odd x) 
        (if (zero? (modulo x 2)) 
         #t 
         #f)) 
    

    少し短い:

    (define (even-odd x) 
        (zero? (modulo x 2))) 
    
    (even? x) 
    
    関連する問題