2017-04-11 25 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

您忘記遞歸調用子表達式上的過程。看到這裏,我在那裏已經改名爲!爲簡潔:

(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))))))))) 

順便說一句,這裏是你會如何改寫程序更地道:

(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

我有3個指針:

如果一個的論點是你沒有評估它的表達。從而。你也需要在兩個參數上運行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 

注意,這裏實際上得到的參數自動計算。這就是連接語言(又名堆棧語言)如何做到的。