2017-04-11 10 views
0

私は最後にオペレータのリストを評価するスキームプログラムを書いています。スキームプログラムはネストされたリストを評価していませんか?

例:(評価「(1 2 +)) - > 3

が、私は基本的な事業者のために働く機能を持っている(+、 - 、*、/)しかし、問題は、私は、ネストされたを持っているときに来ますリスト。

例:(*(1(2 3 +」)を評価)) - >(何も)

私は条件足りませんか?

(define (evaluate lis) 
    (cond 
     ((not (list? lis)) 
     lis) 
     ((list? lis) 
     (if (equal? (length lis) 3) 
      (cond 
      ((equal? (cddr lis) '(+)) 
      (+ (car lis) (car (cdr lis)))) 
      ((equal? (cddr lis) '(-)) 
      (- (car lis) (car (cdr lis)))) 
      ((equal? (cddr lis) '(*)) 
      (* (car lis) (car (cdr lis)))) 
      ((equal? (cddr lis) '(/)) 
      (/ (car lis) (car (cdr lis))))))))) 

答えて

0

サブ式のプロシージャを再帰的に呼び出すことを忘れた。 1つが

:私は3つのポインターを持って

(define (evaluate lis) 
    (cond 
    ((not (list? lis)) lis) 
    ((= (length lis) 3) 
    (let ((op (case (caddr lis) 
       ((+) +) 
       ((-) -) 
       ((*) *) 
       ((/) /)))) 
     (op (evaluate (car lis)) (evaluate (cadr lis))))))) 
+0

ああ、今問題があります。私は何らかの理由で私の言葉が裏返しになったと思った。再帰的に関数を呼び出すことを完全に忘れてしまった。私はSchemeの新機能ですので、リストがどのように機能するか興味深いです。ありがとうございました! – Disc0nnect

1

:ちなみに

(define (! lis) 
    (cond 
    ((not (list? lis)) 
    lis) 
    ((list? lis) 
    (if (equal? (length lis) 3) 
     (cond 
     ((equal? (cddr lis) '(+)) 
      (+ (! (car lis)) (! (cadr lis)))) 
     ((equal? (cddr lis) '(-)) 
      (- (! (car lis)) (! (cadr lis)))) 
     ((equal? (cddr lis) '(*)) 
      (* (! (car lis)) (! (cadr lis)))) 
     ((equal? (cddr lis) '(/)) 
      (/ (! (car lis)) (! (cadr lis))))))))) 

ここにあなたがより多くの慣用的にプログラムを書き換える可能性がある方法です、私は簡潔にするため、それ!と改名しましたところ、こちらを参照してください。あなたがそれを評価していない表現です。したがって、両方の引数でpostfixを実行する必要があります。

長さが3ではない場合、実装ではifが返す値を選択します。ラケットの場合は#<void>です。おそらくあなたは何かを選ぶべきでしょうか?実際に取得ここで引数は自動的に評価

(define (peval exprs) 
    (define primitives `((+ . ,+) (- . ,-) (* . ,*) (/ . ,/))) 
    (foldl (lambda (operator operands) 
      (let ((aproc (assq operator primitives))) 
      (if aproc 
       (cons ((cdr aproc) (cadr operands) (car operands)) 
         (cddr operands)) 
       (cons operator operands)))) 
     '() 
     exprs)) 

(peval '(2 3 4 + *)) ; (2 (3 4 +) *) == 14 

注意:あなたはあなたの言葉の引数の固定数を持っているので

は、括弧は必要ありません。これは、連結言語(スタック言語とも呼ばれます)がそれを行う方法です。

関連する問題