Как установить список 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
,