将“简单方案”语言添加到DrRacket

时间:2013-10-05 22:43:35

标签: scheme racket

我想完成这本书:http://www.eecs.berkeley.edu/~bh/ss-toc2.html。但是我很难让“简单方案”语言起作用。代码不会运行。

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

我不断收到以下错误消息:“解析:模块中的未绑定标识符:解析”。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

还有一个模块允许您运行" Simply Scheme"这里: https://gist.github.com/alexgian/5b351f367169b40a4ad809f0bb718e1f

您可以运行它,然后以交互方式键入代码,无需像上面提到的Planet / dyoo代码那样安装。 但是,如果您希望安装它,那么您所要做的就是使用 #lang simple-scheme 为任何程序添加前缀,它将起作用。 有关如何操作的说明,请参见此处: https://groups.google.com/forum/#!topic/racket-users/jHPtw3Gzqk4 在Matthew Butterick的消息中,2018年6月4日。

这个版本负责一些未完成dyoo代码的东西,例如

> (first 'american)
'a
> (first 'American)
"A"
> (every butfirst '(AmericAn Legacy CODE))
'("mericAn" egacy "ODE")

即。字符串和符号的混合不正确,而不是

> (first 'american)
a
> (first 'American)
A
> (every butfirst '(AmericAn Legacy CODE))
(mericAn egacy ODE)    

应该如此。 对于文档等,dyoo实现可能更完整,但

但是,如上面的答案中所述,您仍然需要自己输入解析函数的代码,因为这是作者的意图。

答案 2 :(得分:0)

我必须恢复到DrRacket 5.4.1才能让Simply Scheme和SICP​​工作。