Новичок в языке Common LISP: макро-вопрос для определения пакетов на лету

Я думал слишком сложно: в моем случае (для выражения содержимого файла) алгоритм «SHA» -Secure Hash - фактически НЕ требуется, простая хеш-функция может сделать эту работу. Таким образом, будет использоваться CRC32, что позволяет последовательно добавлять байты.

5
задан 4 revs, 3 users 100% 20 May 2009 в 05:33
поделиться

2 ответа

defpackage является макросом. По сути, это расширено во время компиляции, не время выполнения. То, что Вы хотите, является чем-то, что называют во времени выполнения для создания нового пакета. Поэтому defpackage ничего не может сделать для Вас.

К счастью, существует также делать-пакет, который обеспечивает функции defpackage как функцию. Используйте его вместо defpackage.

8
ответ дан 14 December 2019 в 04:50
поделиться

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

В Вашем первом make-package-from-path def-dynamic-package получит как аргумент список, который РАВЕН значению следующего выражения:

(list 'pathname-name 'path)

В Вашем случае Вы только хотите функцию:

(defun def-dynamic-package (name)
  (defpackage (string-upcase name)
    (:use :common-lisp)))

BTW при проверке CLHS Вы будете видеть, что первым аргументом defpackage не должен быть символ, но любой строковый указатель.

0
ответ дан 14 December 2019 в 04:50
поделиться