Как я могу запустить алгоритм, написанный для Digitool 4.3 (2003)?

#lisp #common-lisp #mcl

#lisp #common-lisp #mcl

Вопрос:

Я работаю над вычислительной музыкой. Я нашел алгоритм написания высоты тона ps13, реализованный в Lisp в 2003 году, а именно «Digitool MCL 4.3». Я хотел бы запустить этот код, предпочтительно на машине Linux x86, чтобы сравнить его результаты с другими подобными кодами.

Я новичок в Lisp, но пока мои исследования привели меня к мысли, что Digitool MCL больше не доступен. Я подумал о двух способах, которые могут мне помочь:

  • виртуальная среда (Docker или другая), которая будет эмулировать машину с 2003 года…
  • инструмент перевода кода, который преобразует исходный код 2003 года во что-то исполняемое сегодня

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

Может кто-нибудь мне помочь?

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

1. Common Lisp — это стандартизированный язык, и MCL реализует этот Common Lisp. Если не используются какие-либо особенности, то этот код, вероятно, будет выполняться в других реализациях. Если в коде используются функции, специфичные для MCL и Mac, то он нуждается в некотором переносе. Вам нужно посмотреть на код, чтобы увидеть, является ли он переносимым кодом или нет.

2. Спасибо за ваш комментарий. К сожалению, я не знаю Lisp и совершенно не могу определить, используются ли «специфические функции MCL и Mac». Я просто знаю, что при попытке его запуска я столкнулся с кучей предупреждений и ошибок, и, возможно, я даже «запускал» его неправильно…

Ответ №1:

Краткие сведения

Этот код очень близок к переносимому CL: вам не понадобится что-то, эмулирующее древний Mac, чтобы запустить его. Я запустил его в трех реализациях (SBCL, LispWorks, CCL) в течение нескольких минут. Однако, если вы не специалист по Lisp (и не хотите им становиться), это будет несколько сложнее сделать.

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

(Мета-резюме: хотя я думаю, что вопрос в порядке, любой разумный ответ, вероятно, не подходит для SO.)


Подробные сведения

Одна из первоначальных проблем с этим кодом заключается в том, что файл использует старые соглашения о конце строки Mac (я думаю: в любом случае, не Unix): если какой-либо Lisp, который вы используете, достаточно умен, чтобы заметить это (некоторые есть, SBCL, похоже, нет, хотя я уверен, что есть варианты, чтобы сообщить об этом), вам понадобитсячтобы преобразовать его.

Учитывая это, код, который реализует этот алгоритм, очень, очень близок к переносимому Common Lisp. Он имеет четыре зависимости от нестандартных вещей:

  • две глобальные переменные *save-local-symbols* и *verbose-eval-selection* ;
  • две функции: choose-file-dialog и choose-directory-dialog .

Глобальные переменные, вероятно, можно безопасно закомментировать, поскольку я думаю, что они, вероятно, являются просто элементами управления для компилятора. Функции имеют довольно очевидные спецификации: они, очевидно, предназначены для всплывающих окон выбора файлов / каталогов.

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

Но на самом деле все становится лучше: новейшим потомком MCL является Clozure CL: CCL является бесплатным и с открытым исходным кодом. В CCL уже есть оба choose-file-dialog и choose-directory-dialog оба глобальных параметра существуют, хотя один больше не экспортируется.

К сожалению, тогда возникают некоторые скрытые проблемы с переносимостью, связанные с предположениями о том, как имена путей выглядят как строки: я думаю, это делает некоторые предположения о том, как все выглядело на компьютерах Mac до OSX. Такого рода проблемы просты, но часто их немного сложно исправить (я думаю, в этом случае это было бы легко). Итак, опять же, ответ на это — просто не вызывать вещи, которые сильно перегружают путь:

 > (ps13-test-from-file-list (directory "~/Downloads/d/*.opnd"))

[... much output ...]

Total number of errors = 81.
Total number of notes = 41544.
Percentage correct = 99.81%

nil
 

Обратите внимание, что приведенный выше вывод получен из LispWorks, а не из CCL: CCL работает так же хорошо, как, вероятно, и любой CL.

У SBCL есть одна дополнительная проблема: CL-USER пакет в SBCL уже использует пакет, который экспортирует int , который определен в этом коде. Поэтому вам нужно скомпилировать его в каком-нибудь другом пакете. Но, учитывая это, это нормально и в SBCL.

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

1. Вау! Большое вам спасибо за этот подробный ответ! Да, я хотел бы получить уведомление, если вы получите положительный ответ от автора, чтобы сделать этот код переносимым (на самом деле, я был на грани того, чтобы спросить его сам). К моему сведению, какой форум был бы лучше для этого вопроса?

2. @rfs: Хорошо, я отправил ему письмо, и если он ответит, мы сможем связаться с ним, я думаю. Я неправильно сформулировал свой комментарий «не подходит для SO» (теперь изменен): Я думаю, что вопрос был в порядке, просто мой ответ (который вы не могли знать!) На самом деле не подходит. Извините: я не имел в виду, что вы выбрали неправильное место для вопроса!

3. @rfs: теперь в его репозитории есть ожидающий запрос на извлечение, в котором есть некоторые исправления переносимости. Однако обратите внимание, что существуют более поздние версии ps13 алгоритма, я думаю, на Java, и вы можете захотеть запустить их вместо этого, если ваша цель — исследование, а не игра с Lisp.