Lisp中的“ ***-EVAL:未定义函数X”

时间:2019-07-11 16:16:38

标签: lisp interpreter esoteric-languages

我正在为一种深奥的编程语言做一个解释器,为此我编写了这个程序。但是,它没有提供所需的输出,而是输出

  

***-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

2 个答案:

答案 0 :(得分:3)

确实需要从一本精巧的书开始,例如PCLACL。 您将节省很多时间。

Lisp语法不同于C。

在C中,相等性==是一个前缀 operator ,用作x == 1。 在Lisp等式谓词=中,eql&c是普通的函数

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

但是,这只是代码中许多其他问题之一。 您要做需要获得一本教科书。

另请参阅clisp: variable has no value

答案 1 :(得分:1)

这里是一种语言的解释器,它有点像Deadfish,它没有试图变得愚蠢而又聪明,但是却确实变得有点Li而不舍(也许在某种程度上有点烦人的纯粹主义意义)。特别是:

  • 没有任务;
  • 通过尾部调用进行循环;
  • 该程序将返回其将要打印的内容的列表(实际上,它将返回两个值:将要打印的内容和累加器的最终值);
  • 它确实有副作用:它从输入流中读取。

这几乎可以肯定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