Использование функции заданного интервала parenscript
Я видел много примеров, когда (set-interval "my-method" n)
Функция используется для вызова функции каждые n секунд в браузере, но я не могу получить set-interval
функция для запуска.
Если я использую:
(ql:quickload :parenscript)
(use-package :parenscript)
(use-package: ps-window-wd-symbols)
Я получаю много столкновений пространства имен и set-interval
все еще неопределенная функция.
Я также пытался (ps:unobfuscate-package "ps-window-wd-symbols")
который возвращает NIL и ничего не делает.
Как правильно это сделать?
Обновление: использование (apropos "set-interval")
обеспечивает:
(apropos "set-interval")
SET-INTERVAL
SMACKJACK::SET-INTERVAL
PS-WINDOW-WD-SYMBOLS:SET-INTERVAL
Так что это предоставляется в двух местах. Попытка (smackjack::set-interval NIL NIL)
также вызывает ошибку неопределенной функции.
С помощью M-.
возвращает "Неизвестный символ" в пространстве имен моего основного проекта.
2 ответа
Лучший способ использовать эту функцию - использовать ее внутри de defmacro ps.
Как показано в комментариях к документу в коде, вы можете найти это:
;; Это удобные пакеты, которые экспортируют JS и DOM браузера;; символы. Если вы: используйте пакеты в пакете FOO, а затем;; запутать FOO, это предотвратит получение символов JS;; подогнаны.
;; Для большинства задач веб-разработки вы хотите импортировать PS-JS-SYMBOLS;;; PS-WINDOW-WD-SYMBOLS (которая включает в себя DOM level 2 и окно w3c;; рабочий проект) и, возможно, PS-DOM-NONSTANDARD-SYMBOLS.
и функция set-interval экспортируется пакетом ps-window-wd-symbols, а не пакетом parenscript
Defmacro PS:
"При наличии форм Parenscript (неявный progn) компилирует эти формы в строку JavaScript во время макроразворачивания. Расширяется в форму, которая вычисляется в строку.
взгляните на следующую суть:
(ql:quickload :parenscript)
(ql:quickload :cl-who)
(ql:quickload :clack)
(in-package :ps)
(defvar *canvas-id* "alien-canvas")
(clack:clackup
(lambda (env)
(list 200
'(:content-type "text/html")
(list
(who:with-html-output-to-string (*standard-output* nil :prologue t :indent t)
(:html
(:head
(:script :type "text/javascript"
(who:fmt "~A"
(ps (defvar x 0)
(defvar y 0)
(defvar dx 1)
(defvar dy 1)
(defvar img (new -image))
(setf (@ img src) "http://www.lisperati.com/lisplogo_alien_128.png")
(set-interval "draw()" 5)
(defun draw ()
(let ((w 128)
(h 75)
(canvas ((@ document get-element-by-id) #.*canvas-id*)))
(if (or (not canvas) (not (@ canvas get-context)))
(return false))
(let ((ctx ((@ canvas get-context) "2d")))
((@ ctx fill-rect) 0 0 500 500)
(if (and (<= (+ x dx w) 500) (<= 0 (+ x dx)))
(setf x (+ x dx))
(setf dx (* dx -1)))
(if (and (<= (+ y dy h) 500) (<= 0 (+ y dy)))
(setf y (+ y dy))
(setf dy (* dy -1)))
((@ ctx draw-image) img x y))))))))
(:body (:canvas :id *canvas-id* :width 500 :height 500))))))))
НАСКОЛЬКО МНЕ ИЗВЕСТНО, set-interval
это просто символ, а не фактическая функция (в Лиспе). Parenscript создает код Javascript, который затем можно запустить в интерпретаторе JS (например, в браузере), но это не сам интерпретатор.
Parenscript предлагает способ запутывания символов, но также может гарантировать, что некоторые символы не будут запутаны. В документации сказано:
Поскольку Parenscript ничего не знает о DOM или других библиотеках JavaScript, имена библиотечных функций и свойств могут быть непреднамеренно запутаны. Чтобы предотвратить это, Parenscript поставляется с символами ps-dom1, символами ps-dom2, символами ps-window-wd, символами ps-dom-nonstandard и символами ps-dhtml-symbols, которые определяют различные свойства DOM и идентификаторы функций в виде экспортируемых символов (как в регистрозависимых, так и в нечувствительных вариантах), которые вы можете импортировать в свои пакеты, чтобы предотвратить запутывание символов типа pageXOffset. Пакет ps-dhtml-symbols содержит самый широкий диапазон символов и наиболее полезен.
Если вы используете обфускацию и внешние библиотеки JavaScript, вы можете использовать ту же технику для определения ваших собственных пакетов с символами, которые не будут запутаны.
Smackjack также производит вызов setInterval
( pusher.lisp: 189), но он не импортирует символы из вышеуказанных пакетов. Это на самом деле не проблема, потому что здесь используется только имя символа, и не делается запутывание. Другими словами, оба smackjack::set-interval
а также ps-window-wd-symbols:set-interval
сопоставлены с той же функцией Javascript.