Почему понимание списка не генерирует список кортежей? - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь сделать макрос для определения 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 Ответ

0 голосов
/ 13 ноября 2018

Поскольку я новичок в Гиланге, я не знаком с механизмом макроса. После нескольких попыток, наконец, я заставляю его работать должным образом, следующим образом:

(defmacro compound [typename name fields]
`(defclass ~name [~typename]
    [-fields- 
    ~(lfor i (range 0 (len fields) 2)
        `(, 
            ~(str (get fields (+ i 1)))
            ~(get fields i)))]))
...