1

私の講師は次のコードを提供しました:

(define (length list)
(cond (( null ? list) 0 )
(( atom ? list) 1 )
( else
( + 1 ( length (cdr list))))

しかし、それはコンパイルされず、Scheme は入力を待ち続けたので、私には見栄えがよくなるように書き直しましたが、括弧が 2 つ欠けていることに気付きました (Scheme に触れたのはこれが初めてであることに注意してください。私はそうではありません)。それをレイアウトして書く正しい方法を確認してください):

(define 
    (hello list)
    (cond 
        (( null ? list) 0 )
        (( atom ? list) 1 )
        (else
            (+1
                ( hello (cdr list))
            )
        )
    )
)

helloまた、これが私のコード実行であることを明確にするために、名前を に変更しました。

ただし、実行すると次のエラーが発生します。

]=> (hello '(a b c))

;Unbound variable: ?

私の機能の何が問題になっていますか?

4

3 に答える 3

1
(null ? list)

これはnull、引数?およびで関数を呼び出しますlist。ただし、エラー メッセージに示されているように、 という名前の変数は?ありません (また、 という名前の関数もありませんnullが、Scheme はそこまで到達していないため、エラー メッセージには記載されていません)。

ただし、 という名前の関数がありますnull?。これは、ほぼ間違いなく、呼び出すつもりの関数です。そう:

(null? list)

?innull?は単に関数名の一部であり、名前の途中にスペースを入れることはできないことに注意してください。

(atom ? list)次の行も同様です。

于 2013-05-23T18:17:58.827 に答える
0

まず、関数の名前が「ヌル?」と「原子?」。「?」を区切ったので それらからスペースを空けると、Scheme はクエスチョン マークを関数名の一部ではなく、別個の記号として扱っています。

また、同じ理由で「+1」の代わりに「+1」をスペースで区切って使いたいと思うでしょう。関数の名前は「+」で、「1」が最初の引数です。

于 2013-05-23T18:22:32.500 に答える