2013-10-05 48 views
2

我想完成本書的工作:http://www.eecs.berkeley.edu/~bh/ss-toc2.html。但是我很難得到「Simply Scheme」語言的工作。代碼不會運行。將「Simply Scheme」語言添加到DrRacket

#lang planet dyoo/simply-scheme:2 
    (parse ’(4 + 3 * 7 - 5/(3 + 4) + 6)) 

我不斷收到以下錯誤消息:「parse:unbound identifier in module in:parse」。

+0

只是爲了重申:你還沒有定義'parse',所以錯誤信息是正確的:它沒有被「綁定」,因爲沒有內置的'parse'定義。所以你恰當地使用這種語言:語言不是問題的根源。 – dyoo

回答

2

看看這個page,它有完整的說明。只要做到這一點:

#lang racket 
(require (planet dyoo/simply-scheme:2:2)) 

另外要注意的是,字符是不正確,對引用使用',這可能是因爲你複製粘貼代碼錯誤排版。

當然,在完成上述操作之後,您必須定義第18章中介紹的過程,它們沒有在您剛剛導入的包中定義!這將肯定工作:

(define (parse expr) 
    (parse-helper expr '() '())) 

(define (parse-helper expr operators operands) 
    (cond ((null? expr) 
    (if (null? operators) 
     (car operands) 
     (handle-op '() operators operands))) 
    ((number? (car expr)) 
    (parse-helper (cdr expr) 
       operators 
       (cons (make-node (car expr) '()) operands))) 
    ((list? (car expr)) 
    (parse-helper (cdr expr) 
       operators 
       (cons (parse (car expr)) operands))) 
    (else (if (or (null? operators) 
       (> (precedence (car expr)) 
      (precedence (car operators)))) 
      (parse-helper (cdr expr) 
       (cons (car expr) operators) 
       operands) 
      (handle-op expr operators operands))))) 

(define (handle-op expr operators operands) 
    (parse-helper expr 
     (cdr operators) 
     (cons (make-node (car operators) 
       (list (cadr operands) (car operands))) 
       (cddr operands)))) 

(define (precedence oper) 
    (if (member? oper '(+ -)) 1 2)) 

(define (compute tree) 
    (if (number? (datum tree)) 
     (datum tree) 
     ((function-named-by (datum tree)) 
     (compute (car (children tree))) 
     (compute (cadr (children tree)))))) 

(define (function-named-by oper) 
    (cond ((equal? oper '+) +) 
    ((equal? oper '-) -) 
    ((equal? oper '*) *) 
    ((equal? oper '/) /) 
    (else (error "no such operator as" oper)))) 

(parse '(4 + 3 * 7 - 5/(3 + 4) + 6)) 
=> '(+ (- (+ (4) (* (3) (7))) (/ (5) (+ (3) (4)))) (6)) 

(compute (parse '(4 + 3 * 7 - 5/(3 + 4) + 6))) 
=> 30 2/7 
+0

謝謝你,奧斯卡。我試過了,但發生同樣的錯誤。 – JimBoy

+0

@JimBoy我在代碼中發現了第二個錯誤,你使用'''而不是'''來引用。除此之外,您只需複製第18章中的定義,如上面更新後的答案所示。 –

+1

我沒有注意到引用是錯誤的。它正在工作! :) 謝謝。 – JimBoy

0

我只好回覆,以獲得這兩個簡單的計劃和SICP​​合作,DrRacket 5.4.1。