Использование функции заданного интервала 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.

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