scheme - 将 "Simply Scheme"语言添加到 DrRacket

标签 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))

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

最佳答案

看看这个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

关于scheme - 将 "Simply Scheme"语言添加到 DrRacket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19203498/

相关文章:

recursion - 实现最后一个非零而不延续

lisp - 可以在 Scheme REPL 中重置用户环境吗?

scheme - 在 Lisp 中评估函数

lisp - 如何在方案中获取列表(子列表)的一部分?

java - 为我愚蠢:解析是什么?

functional-programming - Racket 中的引用变量

emacs - 如何跳转到 EMACS 中的方案定义

scheme - 如何在文件中记录方案 session ?

file - 更改 Racket 中文件的所有权

list - 方案满屋戳功能