Как установить список Lisp в качестве значения переменной JavaScript, используя parenscript? - PullRequest
0 голосов
/ 30 апреля 2018

у меня есть:

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

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

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

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

Где:

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

  • *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 Ответ

0 голосов
/ 30 апреля 2018

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

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

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

(apply expression-impl (cdr form))

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

...