Почему понимание списка не генерирует список кортежей?
Я пытаюсь сделать макрос для определения ctypes.Structure. Макрос указан следующим образом:
(defmacro struct [name fields]
`(defclass ~name [ctypes.Structure]
[-fields-
~(lfor i (range 0 (len fields) 2)
(tuple [
(str (get fields (+ i 1)))
(get fields i)))]))
Я думаю, что выражение lfor сгенерирует список кортежей, однако, когда я раскрываю макрос с помощью macroexpand, я обнаружил, что сгенерированный список - это список списков, а кортежи не созданы. Результат macroexpand определяется как:
=> (macroexpand '(struct Point [ctypes.c_int x ctypes.c_int y]))
HyExpression([
HySymbol('defclass'),
HySymbol('Point'),
HyList([
HySymbol('ctypes.Structure')]),
HyList([
HySymbol('-fields-'),
HyList([
HyList([
HyString('x'),
HySymbol('ctypes.c_int')]),
HyList([
HyString('y'),
HySymbol('ctypes.c_int')])])])])
Я совершенно сбит с толку, что кортеж в выражении lfor, похоже, вообще не работает.
1 ответ
Так как я новичок в Hylang, я не знаком с механизмом макро. После нескольких попыток, наконец, я заставляю это работать должным образом, следующим образом:
(defmacro compound [typename name fields]
`(defclass ~name [~typename]
[-fields-
~(lfor i (range 0 (len fields) 2)
`(,
~(str (get fields (+ i 1)))
~(get fields i)))]))