2012-06-01 2 views
3

Я пытаюсь импортировать некоторые функции из нестандартных встроенных функций SBCL для использования с сокетом. Когда я делаю это за пределами слизи, с открытой интерактивной оболочкой + SBCL она работает, но не в SLIME.Импортировать пакет в SLIME REPL

Что я сделал:

(import 'sb-bsd-sockets:host-ent-address) 
(import 'sb-bsd-sockets:get-host-by-name) 

или

(use-package :sb-bsd-sockets) 

После этого ни один, SLIME встречает меня с ошибкой, говоря, что я пытаюсь импортировать что-то уже в пакете CL-пользователя , Это исправляемая ошибка, которую я исправляю, выбирая символы, найденные в пакете sb-bsd-socket. Дальнейших ошибок не последовало.

Затем, когда я пытаюсь скомпилировать функцию:

(defun nslookup (hostname) 
    (if hostname 
     (sb-bsd-sockets:host-ent-address (sb-bsd-sockets:get-host-by-name hostname)) 
     nil)) 

Он работает. Но если я пытаюсь скомпилировать это:

(defun nslookup-1 (hostname) 
    (if hostname 
     (host-ent-address (get-host-by-name hostname)) 
     nil)) 

Тогда я получаю предупреждение о неопределенных функций, и сообщение об ошибке при попытке вызова nslookup-1.

К моему удивлению, если я пытаюсь сделать это в РЕПЛ:

CL-USER> #'host-ent-address 
#<STANDARD-GENERIC-FUNCTION HOST-ENT-ADDRESS (1)> 
CL-USER> 

она "работает". То есть он знает эту функцию, но решает не использовать ее ...

Должен быть какой-то (специальный?) способ либо импортировать пакеты в REPL SLIME, либо, по крайней мере, символы из этих пакетов, в противном случае очень неудобно использовать длинные имена для тестирования, а затем для их замены для фактической программы ...

ответ

2

Если «исправляемая ошибка» означает «столкновение имен», это проблема, с которой вы можете справиться, определяя свои собственные пакеты и используя :shadow и :shadowing-import-from статьи. Проверьте Chapter 21 of PCL для деталей.

Короткий ответ: если вы пытаетесь импортировать новый символ, который уже определен в текущем пакете, что вам нужно сделать shadowing-import вместо стандартного import (хотя вы действительно должны использовать соответствующие положения для defpackage вместо вызова это сами).

Для второй части, что вы подразумеваете под «скомпилировать функцию»? Когда я оцениваю это второе определение nslookup-1 после shadowing-import в двух частях от :sb-bsd-sockets, он отлично работает. Вы уверены, что пытаетесь оценить его в пакете, где вы уже импортировали соответствующие функции?

0

импорт пакетов в РЕПЛ слизи в

Вы не можете импортировать пакеты в РЕПЛ слизи, потому что такое понятие не существует. «REPL» не может импортировать пакеты.

Символы могут принадлежать некоторой упаковке. Символы могут быть импортированы в пакет. Вы также можете импортировать экспортированные символы из одного пакета в другой.

Читатель имеет текущий пакет, значение символа cl:*package*.Когда вы взаимодействуете с Lisp, этот пакет используется как пакет по умолчанию. Всякий раз, когда вы скомпилируете файл или введите что-то вроде REPL, этот пакет по умолчанию используется.

Вам необходимо контролировать, какой тип упаковки используется. Это, например, почему вы положили (in-package "FOO") в начале файла. Вы также можете ввести (in-package "FOO") в REPL, а затем *package* - это пакет с именем FOO.

Если вы хотите использовать символы без квалификатора пакета (foo вместо bar:foo), вам либо необходимо установить *package* в этот пакет, либо в пакет, который импортирует эти символы.

Итак, все, что вам нужно сделать, это убедиться, что cl: package указывает на правильный пакет, и если вы импортируете символы, то импортируете их в правильный пакет.

Пример:

CL-USER 191 > (defpackage "FOO" (:use "CL")) 
#<The FOO package, 0/16 internal, 0/16 external> 

CL-USER 192 > *package* 
#<The COMMON-LISP-USER package, 155/256 internal, 0/4 external> 

CL-USER 193 > (defpackage "FOO" (:use "CL")) 
#<The FOO package, 0/16 internal, 0/16 external> 

CL-USER 194 > cl:*package* 
#<The COMMON-LISP-USER package, 155/256 internal, 0/4 external> 

CL-USER 195 > (in-package "FOO") 
#<The FOO package, 0/16 internal, 0/16 external> 

FOO 196 > cl:*package* 
#<The FOO package, 0/16 internal, 0/16 external> 
Смежные вопросы