#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?