解析Scheme中的具体语法

时间:2017-04-09 07:41:56

标签: parsing scheme

我编写了一个过程,该过程获得了减法的有效前缀列表(例如,“( - 6 5)”,我们称之为“6-5”)。这是我的代码:

public

它在逻辑上工作正常,但我不理解打印中缩进的逻辑。输入:

  

(parse-prefix'( - - 1 2 - 3 - 4 5))

打印:

(define parse-diff-list
(lambda (datum)
(cond
  ((number? datum) (const-exp datum))  ;; if datum is a number, return const-exp
  ((pair? datum)                       ;; if datum is a pair:
    (let ((sym (car datum)))                ;; let sym be the first of the pair
      (cond
      ((eqv? sym '-)                          ;; if sym is minus:
       (let ((lst1 (parse-diff-list (cdr datum)))) ;; parse second element of subtraction
         (let ((lst2 (parse-diff-list (cdr lst1))))  ;; parse first element of subtraction
           (cons (diff-exp (car lst1) (car lst2)) (cdr lst2))))) ;; "perform" the subtraction
      ((number? sym)                         ;; if sym is number:
       (cons (const-exp sym) (cdr datum)))   ;; return const-exp with the remainder of the list, yet to be processed
      (else (eopl:error 'parse-diff-list "bad prefix-expression, expected - ~s" sym)))))
  (eopl:error 'parse-diff-list "bad prefix-expression ~s" datum))))

(define parse-prefix
  (lambda (lst)
    (car (parse-diff-list lst))))

虽然我想要以下打印样式:

#(struct:diff-exp
  #(struct:diff-exp #(struct:const-exp 1) #(struct:const-exp 2))
  #(struct:diff-exp #(struct:const-exp 3) #(struct:diff-exp #(struct:const-exp 4) #(struct:const-exp 5)))

这对我来说不仅仅是一个小问题,因为它确实会产生缩进,但我不知道它是如何做到的。

非常感谢!

1 个答案:

答案 0 :(得分:0)

查看racket/pretty漂亮的打印库。

特别注意参数(pretty-print-columns) 你可以像这样设置:

`(pretty-print-columns 40)`

为了避免排长队。

http://docs.racket-lang.org/reference/pretty-print.html

(我猜你正在根据结构的打印方式使用DrRacket)