Я часто использую такие символы пакетов:
(ql:quickload :cl-json)
(cl-json:encode-json-to-string .... )
Я хотел бы использовать его так, без части cl-json
:
(defpackage custom-sender
;; import the exactly the symbols I need from a package
(:import-from :cl-json :encode-json-to-string)
(:use :cl))
(encode-json-to-string .....)
Как видите, я попытался использовать import-from, чтобы получить этот единственный символ.
Однако я все еще получаю сообщение об ошибке, что encode-json-to-string
не определено.
DEFPACKAGE
определяет пакет. Он сам не устанавливает никакой области действия.
Если вы хотите установить область действия пакета, используйте IN-PACKAGE
. Вы импортировали символ в определенный пакет, затем вам нужно сделать этот пакет текущим, чтобы увидеть эффекты.
Простая загрузка чего-либо может не установить определенный пакет, который вы ожидаете.
Помнить:
Система ASDF может определять ноль или более пакетов. система и пакеты — это два разных и ортогональных понятия в Common Lisp.
Система ASDF (популярный инструмент сборки) — это инструментальное название библиотеки/некоторого программного обеспечения. Это может быть скомпилировано, загружено и т.д.
Пакет Common Lisp — это пространство имен для символов. Это стандартная функция языка. пакеты ничего не знают о системах.
В некоторых языках программирования (скажем, в Java) класс может быть определен в одном файле и также быть пространством имен. В Common Lisp есть файлы, пространства имен, модули/системы,... все независимые концепции. Вполне возможно определить библиотеку, вкл. его n пакетов в одном файле. Обычно люди организуют свое программное обеспечение в виде набора файлов, одного или нескольких пакетов и одной или нескольких систем. тогда системы представляют собой набор файлов, которые вместе могут быть скомпилированы/загружены.
«пакеты ничего не знают о системах» — чрезвычайно важная мысль, о которой я не знал. Спасибо вам за это.
О: добавить
(in-package :custom-sender)
, прежде чем использовать его? Вероятно, у вас есть подсказка в сообщении об ошибке: «функция CL:ENCODE… не определена». где вы можете увидеть квалификатор пакета CL вместо вашего.