Как написать функцию на лиспе. Скомпилируйте этот файл на Лиспе. а затем запустите эту программу Lisp

#lisp

#lisp

Вопрос:

Напишите, скомпилируйте и протестируйте функцию на Common Lisp, которая принимает список и подсчитывает общее количество положительных целых чисел в списке. Необходимо скомпилировать, а затем выполнить.lisp-файл, содержащий эту функцию. после компиляции этого файла начните передавать ему список, где после результатов для получения результата, который будет получен, таким образом, проверяя правильность функции.

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

(количество-если #'(lamda (x) (> x 0))

мне нужно скомпилировать это, а затем, например, передать это например :: (1 2 3 4 5), и результат должен быть :: 5 это потому, что их 5 значений, которые равны больше 0

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

1. Добро пожаловать в Stack Overflow! Пожалуйста, следуйте инструкциям, прежде чем задавать свой вопрос о переполнении стека

Ответ №1:

Напишите файл:

 $ echo "(defun test () (print :test))" > test.lisp
 

В том же каталоге запустите среду Common Lisp (пример с CCL), у вас есть REPL; скомпилируйте файл:

 ? (compile-file "test.lisp")
#P"/tmp/test.lx64fsl"
NIL
NIL
 

Обратите внимание, что если вы попытаетесь запустить test функцию, появится сообщение об ошибке, поскольку она не определена в вашей среде.

Загрузите результирующий объектный файл; при загрузке "test" используется объектный файл, если он доступен; вы могли бы вызвать load непосредственно файл «.lisp», но тогда нет никаких гарантий, что файл будет скомпилирован или интерпретирован. Это второстепенная деталь здесь, вы, вероятно, не должны заботиться о компиляции или нет на данном этапе.

 ? (load "test")
 

Теперь, test если она доступна в вашей среде, вы можете вызвать ее:

 ? (test)

:TEST ;; what the function printed
:TEST ;; the returned value, automatically printed by the REPL
 

Не перезапуская среду Lisp, вы можете отредактировать файл и перезагрузить его.
Это минималистичная настройка, но этого должно быть достаточно для начала.

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

1. Есть ли способ использовать compile функцию для компиляции всех функций внутри файла lisp, если по какой-либо причине к нему нет доступа compile-file (например, для приложений, поставляемых LispWorks)?

2. Кажется маловероятным, что compile присутствует, пока compile-file нет, на основе lispworks.com/documentation/lw71/DV/html/delivery-171.htm , но я не знаю; если это так, вы можете load сначала создать файл, который может вызвать саму компиляцию; если вы хотите явно скомпилировать все функции, вам нужно открыть файл, read все формы в цикле, eval их, и когда результатом будет символ fbound , скомпилируйте его. Это небольшой взлом, но он может выполнить эту работу, если это необходимо.

3. Это ответ, который я получил от сопровождающего приложения, спрашивающего, почему в приложении нет ничего compile-file доступного: приложения, поставляемые LispWorks (например, OpenMusic), встраивают большую часть исходной среды Lisp, за исключением функции compile-file .

4. @Student Насколько я знаю, в этом случае у вас есть следующие варианты: (1) не компилируйте, просто загрузите файл (2) создайте собственную версию Lispwroks для любителей (та же версия), вызовите compile-file ее и загрузите в OpenMusic; у вас могут возникнуть проблемы с зависимостями; (3) создайте OpenMusic из исходного кода и запустите все отсюда, не доставляйте приложение или не отключайте доставку для включения compile-file ; я предполагаю, что могут быть ограничения с любительской версией Lispworks, но я не знаю. Вы, безусловно, получите лучшие ответы, поговорив напрямую с сопровождающими.

5. Я не понимаю часть (2) вашего ответа. Что я должен загрузить в openmusic после вызова compile-file из lw?