LISP: как вывести на консоль без использования функций (Print) или (Format t) в рекурсивной функции

#recursion #lisp #clisp

#рекурсия #lisp #clisp

Вопрос:

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

Мои вопросы — это заголовок выше, есть ли какой-либо способ вывода данных на консоль в LISP (я использую CLISP) в конце рекурсивной функции без использования функций (print ..) или (Format T ..)? Это упражнение, в котором говорится, что нам разрешено использовать только следующие функции: defun, cond, car, cdr, cons, append, list , and, not, или, <, >, <=, >=, =, eq, eql, равно, равно, , -,*, /, mod

Я создал рекурсивную функцию, которая создает новый список, и я могу вывести этот список, но только если я оберну рекурсивную функцию внутри функции печати, такой как (print (myRecFunction)) . Это не соответствует критериям упражнения и, следовательно, считается неправильным. Если я не оберну эту функцию вокруг функции печати, консоль будет просто пустой строкой.

Я ищу, может ли кто-нибудь привести простой пример списка, который выводится из вызываемой функции (не обязательно рекурсивной), которая не требует, чтобы она была обернута вокруг функции печати. Прошу прощения, если это слишком расплывчато, если требуется дополнительная информация, пожалуйста, дайте мне знать.

Комментарии:

1. Добро пожаловать в SO, было бы полезно включить код, который вы уже пробовали.

2. Цикл чтения-оценки-печати обычно выводит значение того, что вы вводите, вам не нужно использовать (print) самостоятельно.

3. Невозможно выполнить печать без использования одной из функций PRINx or FORMAT . Упражнение не имеет смысла. Обычно функции не выполняют собственную печать, они просто возвращают значение, и вызывающий объект печатает его, если это то, что он хочет.

4. trace Макрос?

5. Можете ли вы предоставить ссылку или цитату к фактическому упражнению, а также код вашей рекурсивной функции?

Ответ №1:

REPL (цикл печати чтения Eval) выведет для вас результаты верхнего уровня, поэтому единственное, что вам нужно сделать, это убедиться, что ваша рекурсивная функция возвращает значение, которое она должна напечатать, и вы получите именно то, что просите.

Вот функция, которая создает палиндром:

 > (defun magic-string (times string)
    (if (= 0 times)
        string
        (magic-string (1- times) (concatenate 'string string (reverse string)))))
magic-string
> (magic-string 3 "test")
"testtsettesttsettesttsettesttset"
>
  

Теперь все мои реализации lisp печатают результат обоих выражений. Не ваш?