Пятничное

Nov 20, 2009 14:47

А можно ли сделать пакет по свойствам похожий на пакет keyword?

Так, чтобы получилось, что наш пакет содержит любой символ и значением любого символа из этого пакета было бы, скажем, строковое представление этого символа?

> (symbol-value (ourpackage:any_symbol))
"any_symbol"

Leave a comment

Comments 20

lispnik November 20 2009, 09:49:44 UTC
Насколько я знаю, стандартными средствами - нет.

Reply


cmm November 20 2009, 09:56:20 UTC
магические свойства пакета KEYWORD жёстко прошиты в ридере и функции INTERN, как минимум.  ридер можно изнасиловать через новый reader macro (нормального протокола расширения у ридера нет, так что про прозрачную реализацию OURPACKAGE:BLAH можете забыть сразу), а INTERN придётся писать свой и затенять старый - тоже пилёхо.

а теперь, как принято гойворить на канале #lisp, расскажите нам что же Вы на самом деле пытаетесь сделать. :)

Reply

дык пятницо.. время глупых вопросов kmmbvnr November 20 2009, 12:13:03 UTC
Ну так не спортивно. ООП значит потенциально можем сделать средствами языка, а простая система пакетов прошита в ядре.

Reply

Re: дык пятницо.. время глупых вопросов ext_208668 November 20 2009, 14:21:38 UTC
Наверное дело в том, что система пакетов будет покруче, чем какой-то там ООП...

Reply

Re: дык пятницо.. время глупых вопросов kmmbvnr November 20 2009, 14:36:12 UTC
Дык, все же наоборот.

Потенциально система пакетов, это все то же ооп, кроме возможности создать экземпляр пакета :)

Reply


pufpuf November 20 2009, 17:56:17 UTC
во-первых, все-таки не
> (symbol-value (ourpackage:any_symbol))
а
> (symbol-value ourpackage:any_symbol)

а, во-вторых, как верно подмечено, это можно сделать только на уровне макросов чтения (поскольку, по большому счету, : -- это и есть макрос чтения), так что можно так:
> (symbol-value #^any_symbol)
"any_symbol"
:
CL-USER> (defpackage :strword)
#
CL-USER> (set-dispatch-macro-character ( ... )

Reply

kmmbvnr November 21 2009, 03:56:37 UTC
Да, немножко ошибся. С другой стороны any_symbol может быть функцией, что задачу по сути не меняет.

Reply

pufpuf November 21 2009, 08:37:56 UTC
Семантически (symbol-value (ourpackage:any_symbol)) означает: вернуть значение символа, который вернет вызов функции ourpackage:any_symbol. Представь себе вариант (symbol-value (:keyword)). Ведь :keyword -- это только символ, но никогда не функция ( ... )

Reply

love5an November 21 2009, 18:05:35 UTC
> Ведь :keyword -- это только символ, но никогда не функция.
Почему?:)
константы keyword ведь занимают только value cell символа
функции с именами-символами-из-keyword, вроде бы, никто определять не запрещает

Reply


ext_174825 November 21 2009, 21:01:51 UTC
Если делать все как keyword то надо использовать reader macros как уже другие объяснили. Но можно что то аналогичное сделать в рантайм, используя restarts и стандартные condition types unbound-variable и unbound-function. Проблема только в том, что у этих conditions нет стандартных интерфейс и restarts. Джоф Возняк довольно подробно писал о этом - http://exploring-lisp.blogspot.com/2008/01/auto-defining-functions.html

Reply


Leave a comment

Up