Как установить список Lisp в качестве значения переменной JavaScript, используя parenscript?

Я имею:

(ps:ps (ps:var vertices (ps:lisp (cons 'list *VERTICES*))))

который оценивает:

"var vertices = [0.0, -200.0, 0, ... 0.4, 40];"

что является правильным ожидаемым результатом.

Куда:

  • ps относится к паранскрипту (полная документация здесь).

  • *VERTICES* это просто плоский список чисел в моей глобальной среде Lisp


Тем не менее, когда *VERTICES* велика, оценка приводит к ошибке:

Ошибка: слишком много аргументов. При выполнении: PARENSCRIPT::COMPILE-SPECIAL-FORM, в обработчике процесса (1).

Как мне обойти эту ошибку?


Не зная, как Parenscript действительно работает внутри, эту проблему трудно решить. Поэтому я попытался изменить способ передачи списка в PS.

Вот несколько неудачных попыток:

(ps:ps (ps:var vertices (ps:lisp (list *VERTICES*))))
=> "var vertices = 1(2, 3, 4, 0, 9, 0.1)();"

(ps:ps (ps:var vertices (ps:lisp *VERTICES*)))
=> "var vertices = 1(2, 3, 4, 0, 9, 0.1);"

(ps:ps (ps:var vertices *VERTICES*))
=> "var vertices = VERTICES;"

Ни один из них не является правильным ожидаемым результатом.

Как правильно передать значение переменной списка Lisp в parenscript, чтобы сформировать правильный оператор присваивания переменной массива javascript?

1 ответ

Решение

Я смог воспроизвести это с 1000000 предметов. Кажется, что компилятор parenscript (который сидит за этим ps макрос) переводит ваш список в форму (array 1 2 3 4 5 …) первый. Это означает, что array получает миллион аргументов, что довольно необычно для исходного кода.

Я бы порекомендовал подумать над вашим дизайном. Почему вы хотите создать такой большой вектор в исходном коде? Должно ли это быть в отдельном файле или загружаться во время выполнения по сети?

Кстати, вы можете проверить, что происходит, используя отладчик, в который вы попали при ошибке. Например, в SLIME я нажал v на раме compile-special-form чтобы увидеть соответствующий исходный код parenscript. Это показало следующее выражение:

(apply expression-impl (cdr form))

что предполагает, что выражения будут подлежать call-arguments-limit,

Другие вопросы по тегам