2016-11-22 12 views
0

私はここ数ヶ月間Scheme R5RSを自分自身で教えていて、変更可能な機能について学習し始めました。私はこれのようないくつかの機能を果たしましたが、私の間違いを見つけるようです。SCHEME変更可能な機能

(define (lst-functions) 
    (let ((lst '())) 
    (define (sum lst)  
     (cond ((null? lst) 0) 
      (else 
      (+ (car lst) (sum (cdr lst)))))) 
    (define (length? lst) 
     (cond ((null? lst) 0) 
      (else 
      (+ 1 (length? (cdr lst)))))) 
    (define (average) 
     (/ (sum lst) (length? lst))) 
    (define (insert x) 
     (set! lst (cons x lst))) 
    (lambda (function) 
     (cond ((eq? function 'sum) sum) 
      ((eq? function 'length) length?) 
      ((eq? function 'average) average) 
      ((eq? function 'insert) insert) 
      (else 
      'undefined))))) 

(define func (lst-functions)) 
((func 'insert) 2) 
((func 'average)) 

答えて

0

パラメータlstを使用しているプロシージャでは宣言していませんが、呼び出すときに渡しています。私が変更された行をマークし、これを試してみてください。期待通り

(define (lst-functions) 
    (let ((lst '())) 
    (define (sum lst)  ; modified 
     (cond ((null? lst) 0) 
      (else 
      (+ (car lst) (sum (cdr lst)))))) 
    (define (length? lst) ; modified 
     (cond ((null? lst) 0) 
      (else 
      (+ 1 (length? (cdr lst)))))) 
    (define (average) 
     (/ (sum lst) (length? lst))) 
    (define (insert x) 
     (set! lst (cons x lst))) 
    (lambda (function) 
     (cond ((eq? function 'sum) (lambda() (sum lst)))  ; modified 
      ((eq? function 'length) (lambda() (length? lst))) ; modified 
      ((eq? function 'average) average) 
      ((eq? function 'insert) insert) 
      (else 
      'undefined))))) 

は今、それが動作します:長さの先端のための

(define func (lst-functions)) 
((func 'insert) 2) 

((func 'average)) 
=> 2 
((func 'sum)) 
=> 2 
((func 'length)) 
=> 1 
+0

'((func 'sum))'期待どおりに動作しません。 – Sylwester

+0

あなたはそうです、今修正されました。ありがとう! –

-1

あなたの関数のいくつかは再帰的ですが、引数なしで定義されています。したがって、sumlstを使用するので、(sum (cdr lst))は機能しません。アキュムレータと

(define (sum-rec lst) 
    (if (null? lst) 
     0 
     (+ (car lst) (sum-rec (cdr lst))))) 

それとも:あなたはヘルパーを定義することによってそれを行うことができ

(define (sum-iter lst acc) 
    (if (null? lst) 
     acc 
     (sum-iter (cdr lst) (+ (car lst) acc))) 

あなたsumはもちろんlstを渡し、それを使用します。

(define (sum) 
    (sum-iter lst 0)) 

またはすることができますドライバの一部を次のように適用してください:

(lambda (function) 
     (cond ((eq? function 'sum) (lambda() (sum-iter lst)) 
      ...)) 

サイドノート。 length?は奇妙な名前の関数です。名前の最後にある疑問符は、通常、真または偽の値を返す関数用に予約されており、これは明らかに数値を返します。

+0

おかげ?私は組み込みの長さ関数を使用したくないので、それはなぜですか?その事実を念頭に置いておきます。 – Sara

関連する問題