2017-05-05 8 views
0

休憩を使わずにこの仕事をする方法はありますか?(私はcdr lstをどこにでも置いてみましたが、それは私にエラーをもたらします)プラスif if if if(> N 0)私は、ディスプレイがしたいすべてがリスト出力されますので、 - (リストNE)すべて手続きは単にグローバルスコープ内の変数にバインドされていることをスキームでの残りの部分の交換?

(define (count lst) 
(if (null? lst) '() 
    (let ((display (lambda (N E) 
       (if (> N 0) (list N E) (list N E))))) 
    (let loop ((rest (cdr lst)) 
       (E (car lst)) 
       (N 1)) 
     (cond ((null? rest) 
       (list (display N E))) 
      ((eq? E (car rest)) 
       (loop (cdr rest) E (+ N 1))) 
      (else 
       (cons (display N E) (loop (cdr rest) (car rest) 1)))))))) 
+0

注: 'display'は組み込み関数(値を出力)であるため、別の目的でその名前を使用するのは奇妙に思えます。 – soegaard

答えて

0

注 例:?

(let ((rest 5)) 
    (rest '(1 2 3))) 

。 R6RS以降では、例外として、番号5はプロシージャではありません。その理由は、この範囲内のバインディングrestをオーバーライドし、5へのバインドとして変数restを使用し、それをプロシージャとして呼び出さないようにするためです。 R5RS以前では、有効なスキームコードではないため、結果は未定義ですが、ほとんどの実装でR6RSが必要とするのと同じエラーが発生する可能性があります。

displayと同じことをしましたが、今度はdisplayがグローバルdisplay以外の処理を実行しています。 R6RSではOKですが、R5RS以前ではOKではありません。インプリメンテーションは、サポートされているすべてのタイプのグローバルに置き換えることは自由です。 displayすべてタイプをサポートしているため、無効なR​​5RSであるため、すべての実装でコードが機能しない可能性があります。

+0

私はすべてを修正し、コードを短縮しました。ありがとう –

関連する問題