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