基本方案递归

Ben*_*Ben 0 lisp recursion scheme

我有这样一个文件:

    declare
    a = aexpress 
    b = bexpress 
    begin 
Run Code Online (Sandbox Code Playgroud)

我的方案程序将当前输入端口设置为此文件,然后调用 (declarations (read)) 我回来的内容,是#f.或者说控制台说"对象#f不适用".

我已经完成了我的括号使用,并且无法找到任何理由它应该返回一个布尔值,但我确定我错过了一些东西.

我想要的是((a aexpress)(b bexpress))

(define declarations
  (lambda (token)
    (cond (((eq? token 'begin) '())
           (else (let* ((name token)
                        (eqsign (read))
                        (value (read)))
                   (cons (list name value) (declarations (read)))))))))
Run Code Online (Sandbox Code Playgroud)

被称为:

    (define convert
      (lambda (filename)

         (begin
           (set-current-input-port! (open-input-file filename))
           (statement (read))
           )

        )
      )
 (define statement (lambda (token) (

                                   cond (
                                     ( (eq? token 'declare) (declarations (read)) )
                                        ;       ( (eq? token 'declare) (declare_statement)  )
                                        ;       ( (eq? token 'begin) (begin_statement) )
                                        ;       ( (eq? token 'for) (for_statement) )
                                        ;       ( (eq? token 'if) (if_statement)  )
                                        ;       ( (eq? token 'set) (set_statement) )
                                        ;       (else (expression_token))


                                   ))))
Run Code Online (Sandbox Code Playgroud)

Chr*_*ung 5

我已经修复了你的代码格式,它揭示了问题所在:你周围有太多的括号层(eq? token 'begin).固定版本看起来像这样:

(define declarations
  (lambda (token)
    (cond ((eq? token 'begin) '())
          (else (let* ((name token)
                       (eqsign (read))
                       (value (read)))
                  (cons (list name value) (declarations (read))))))))
Run Code Online (Sandbox Code Playgroud)