Регистрация | Войти
Lisp — программируемый язык программирования
RSS
тип записи, ограничивающий тип его элемента
den73 - 23.05.2017 16:29, Сообщений - 4
Икс принадлежит типу ТТ(а,б), если:
1. X является типом Моя-запись
2. Поле Поле1 имеет тип а
3. Поле Поле2 имеет тип б

Я не придумал, как это сделать с помощью deftype и мне пришлось сделать так:


(defmacro DEF-Тип-ТТ-от-а-и-б (имя а б)
   ...
)


(DEF-Тип-ТТ-от-а-и-б ТТ-от-integer-и-string integer string)

(typep X 'ТТ-от-integer-и-string)

Есть ли у кого-нибудь лучшие идеи? 
[#]
P.S. типизированные поля в defstruct не предлагать, потому что мне нужно другое 
den73 - 23.05.2017 16:30
[#] Ответ на комментарий от den73 23.05.2017 16:30
P.P.S. в принципе deftype позволяет вычислять произвольный код, например, можно автоматически сгенерировать имя ТТ-от-integer-и-string 
и определить функцию. Но в промышленной разработке это не сработает (или мне не хватает знаний). 
1. deftype выполняется во время макрорасширения, т.е. ф-я будет определена в compile-time, а мне она нужна в load-time. 
2. непонятно, в какой пакет помещать этот символ. Можно генеририровать новую ф-ю на каждое вхождение ТТ(а,б) в исходник, но это уродство. 
Либо нужно запоминать, что для этой пары а и б мы уже создали ТТ(а,б) и повторного его использовать. Но как поддерживать эту инфраструктуру? 
Опять же нужно что-то делать в load-time. 

den73 - 23.05.2017 16:34
[#] Ответ на комментарий от den73 23.05.2017 16:34
Т.е., по сути моя проблема сводится к следующей: как из deftype запрограммировать действия в load-time? Может быть, я просто туплю, но у меня пока нет идей. 
den73 - 23.05.2017 16:35
[#] Ответ на комментарий от den73 23.05.2017 16:35
Вроде решил:

https://www.linux.org.ru/forum/development/13435681?lastmod=1495569368292#comment-13436195


den73 - 23.05.2017 22:56
@2009-2013 lisper.ru