LINUX.ORG.RU

История изменений

Исправление no-such-file, (текущая версия) :

Можешь подсказать в виде идеи?

Вообще я не очень понял, зачем тебе это надо. Судя по всем заморочкам, ты хочешь получать строковое представление идентификатора константы/переменной. Так вот в лиспе это есть из коробки, т.к. для любого символа можно получить строку через symbol-name.

> (setf IAC 1)
1

> (symbol-name 'IAC)
"IAC"

Если же тебе надо по числу получить строку, или символ, то тут уже без списка(массива, хэша и т.п.) символов никак не обойтись. Вот тут пригодится макрос, который засетапит значения переданных символов и список самих символов.

В итоге должно получиться что-то вроде такого

(defenum *codes* (IAC 1 FOO 2 BAR 3))
;;; Делает
;;; (setf IAC 1 FOO 2 BAR 3)
;;; (defvar *codes* (list 'IAC 'FOO 'BAR))
;;; по желанию можно deftype

(find-enum *codes* 1)
;;; Проходим по *codes*, ищем (= (symbol-value i) 1) возвращаем i и/или (symbol-name i)

Можно ещё сахарка накинуть, прикрутить switch по *codes* и т.п.

Исходная версия no-such-file, :

Можешь подсказать в виде идеи?

Вообще я не очень понял, зачем тебе это надо. Судя по всем заморочкам, ты хочешь получать строковое представление идентификатора константы/переменной. Так вот в лиспе это есть из коробки, т.к. для любого символа можно получить строку через symbol-name.

> (setf IAC 1)
1

> (symbol-name 'IAC)
"IAC"

Если же тебе надо по числу получить строку, или символ, то тут уже без списка(массива, хэша и т.п.) символов никак не обойтись. Вот тут пригодится макрос, который засетапит значения переданных символов и список самих символов.

В итоге должно получиться что-то вроде такого

(defenum *codes* (IAC 1 FOO 2 BAR 3))
;;; Делает
;;; -> (setf IAC 1 FOO 2 BAR 3)
;;; -> (defvar *codes* (list 'IAC 'FOO 'BAR))

(find-enum *codes* 1)
;;; Проходим по *codes*, ищем (= (symbol-value i) 1) возвращаем i и/или (symbol-name i)

Можно ещё сахарка накинуть, прикрутить switch по *codes* и т.п.