«*** - EVAL: неопределенная функция X» в Лиспе - PullRequest
0 голосов
/ 11 июля 2019

Я делаю переводчик для эзотерического языка программирования, и я сделал эту программу для него. Однако вместо того, чтобы выдавать желаемый результат, он выводит

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

3 голосов
/ 11 июля 2019

Вам на самом деле нужно начать с хорошей книжки-шпиона, например, PCL или ACL .Вы сэкономите много времени.

Синтаксис Lisp отличается от C.

В C равенство == является инфиксным оператором , используемым как x == 1.В Лиспе предикаты равенства =, eql и c являются обычными функциями .

Таким образом, вам нужно написать (eql x #\i).

Это, однако, только одиниз многих других проблем с вашим кодом.Вам нужно нужно получить учебник.

См. Также clisp: переменная не имеет значения .

1 голос
/ 12 июля 2019

Вот интерпретатор для языка, который немного похож на 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
...