0

我正在为一种深奥的编程语言制作解释器,并为它制作了这个程序。但是,它没有给出所需的输出,而是输出

*** - EVAL:未定义的函数 X

任何人都可以帮助澄清这个程序的问题吗?

我已经尝试过用谷歌搜索这个错误,并在这个网站上检查类似的问题。

(setq acc 0)        
(loop              
    (setq x (read-char))                  
    (when (x = #\i)(acc(+ acc 1))) 
    (when (x = #\d)(acc(- acc 1)))        
    (when (x = #\s)(acc(* acc acc)))      
    (when (x = #\o)(write(acc)))  
    (when (x = #\h)(return x))        
    (when (acc <0 or acc =255)(acc =0)))

输入"iiiso"应该给出输出9。但是,实际输出是

*** - EVAL:未定义的函数 X

4

2 回答 2

4

确实需要从一本好的 lisp 书籍开始,例如PCLACL。你会为自己节省很多时间。

Lisp 语法与 C 不同。

在 C 中,相等==是一个中缀运算符,用作x == 1. 在 Lisp 等式谓词=中,eql&c 是普通函数

因此,您需要编写(eql x #\i).

然而,这只是您的代码的许多其他问题之一。你确实需要一本教科书。

另请参见clisp: variable has no value

于 2019-07-11T16:41:01.880 回答
1

这是一种语言的解释器,它有点像Deadfish,它没有试图愚蠢地简洁和聪明,但确实试图变得有点 Lispy(也许在有点令人讨厌的纯粹主义意义上)。尤其是:

  • 没有任务;
  • 循环是通过尾调用;
  • 而是程序返回一个它会打印的列表(实际上它返回两个值:它会打印什么和累加器的最终值);
  • 但它确实有副作用:它从输入流中读取。

这几乎证实了 CL:

  • CL 实现不必支持尾调用优化,因此允许在大型程序中耗尽堆栈;
  • 我认为这#\Tab只是一个半标准的字符名称。

我不确定这是否完全正确:

  • 该程序在循环开始时修复了累加器,我不确定这是否正确;
  • 我不清楚 Deadfish 程序对不属于该语言的输入的含义是什么——这个会呕吐。

这里:

(defun deadfish (&key (in *standard-input*)
                      (initial-value 0))
  ;; Deadfish from a stream
  (labels ((dfl (acc results)
             (case acc
               ((-1 256)
                (dfl 0 results))
               (otherwise
                (let ((c (read-char in nil in)))
                  (if (eql c in)
                      (values (reverse results) acc)
                    (ecase c
                      ((#\h) (values (reverse results) acc))
                      ((#\i) (dfl (1+ acc) results))
                      ((#\d) (dfl (1- acc) results))
                      ((#\s) (dfl (* acc acc) results))
                      ((#\o) (dfl acc (cons acc results)))
                      ((#\Newline #\Space #\Tab)
                       (dfl acc results)))))))))
    (dfl initial-value '())))

(defun deadfish/string (string &key 
                               (initial-value 0))
  ;; Deadfish from a string
  (with-input-from-string (in string)
    (deadfish :in in :initial-value initial-value)))

> (map 'string #'code-char
       (deadfish/string
        "iisiiiisiiiiiiiioiiiiiiiiiiiiiiiiiiiiiiiiiiiiioiiiiiiiooiiio
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddo
dddddddddddddddddddddsddoddddddddoiiioddddddoddddddddo"))
"Hello world"

有趣的是,这个程序可能比许多实现更正确:

> (deadfish/string "iiissssssssssoh")
(373391848741020043532959754184866588225409776783734007750636931722079040617265251229993688938803977220468765065431475158108727054592160858581351336982809187314191748594262580938807019951956404285571818041046681288797402925517668012340617298396574731619152386723046235125934896058590588284654793540505936202376547807442730582144527058988756251452817793413352141920744623027518729185432862375737063985485319476416926263819972887006907013899256524297198527698749274196276811060702333710356481)
373391848741020043532959754184866588225409776783734007750636931722079040617265251229993688938803977220468765065431475158108727054592160858581351336982809187314191748594262580938807019951956404285571818041046681288797402925517668012340617298396574731619152386723046235125934896058590588284654793540505936202376547807442730582144527058988756251452817793413352141920744623027518729185432862375737063985485319476416926263819972887006907013899256524297198527698749274196276811060702333710356481
于 2019-07-12T10:03:42.220 回答