2016-06-26 10 views
1

このコードはシンプルスキーム(コードhere)のコードであり、私たちがエクササイズと一緒にロードして使用するようになっています。 (注:私は、個人が自分だけのためにこれをやっている)なぜScheme内部で関数を再割り当てするのですか?

(define first 
    (let ((pair? pair?) 
    (char->word char->word) 
    (string-ref string-ref)` 
    (word->string word->string) 
    (car car) 
    (empty? empty?) 
    (whoops whoops) 
    (word? word?)) 
    (define (word-first wd) 
     (char->word (string-ref (word->string wd) 0))) 
    (lambda (x) 
     (cond ((pair? x) (car x)) 
     ((empty? x) (whoops "Invalid argument to FIRST: " x)) 
     ((word? x) (word-first x)) 
     (else (whoops "Invalid argument to FIRST: " x)))))) 

私はこの機能でletlambdaの一般的な使用を理解するために沿って十分だけど、私は理解していないが理由です(pair? pair?)および(car car)のように、それぞれのサポート機能(手作りのもの、バッテリに含まれているものなど)が繰り返されている形式のletです。これらはなぜletの中に準再割当てされていますか?

答えて

5

このコードは、組み込みのバインディングを再定義できるものを含め、さまざまなScheme実装で「ライブラリコード」として使用するように設計されています。 letは、ユーザーが後でトップレベルのバインディングを再定義した場合でも、元のバインディングがライブラリ関数で確実に使用されるようにします。

あなたが書いたライブラリ以外のコードでは、一般的に心配する必要はありません。また、不変モジュールバインディング(Racketなど)を適用するモジュールシステムでScheme実装を使用している場合でも、それは問題ではありません。

関連する問題