Lisp 使用parenscript集区间函数

Lisp 使用parenscript集区间函数,lisp,common-lisp,parenscript,Lisp,Common Lisp,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包“ps window wd sy

我见过很多例子,其中
(set interval“my method”n)
函数用于在浏览器中每隔n秒调用一个函数,但我无法运行
set interval
函数

如果我使用:

(ql:quickload :parenscript)
(use-package :parenscript)
(use-package: ps-window-wd-symbols)
我遇到了很多名称空间冲突,
set interval
仍然是一个未定义的函数

我还尝试了
(ps:unobfuscate包“ps window wd symbols”)
,它返回NIL,什么也不做

正确的做法是什么

更新:使用
(恰如其分的“设置间隔”)
提供:

(apropos "set-interval")
                     SET-INTERVAL
          SMACKJACK::SET-INTERVAL
PS-WINDOW-WD-SYMBOLS:SET-INTERVAL
因此,它在两个地方提供。尝试
(smackjack::set interval NIL NIL)
也会导致未定义的函数错误


使用
M-。
在我的主项目名称空间中返回“No known Symbol”。

AFAIK,
set interval
只是一个符号,而不是实际的函数(在Lisp中)。Parenscript生成Javascript代码,然后可以在JS解释器(例如浏览器)中运行,但这不是解释器本身

Parenscript提供了一种混淆符号的方法,但也可以保证某些符号不会混淆。说:

因为Parenscript对DOM或其他方面一无所知 JavaScript库、库函数和属性名称可能是 无意中混淆了。为了防止这种情况,Parenscript附带了 ps-dom1符号、ps-dom2符号、ps窗口wd符号、, ps dom非标准符号和ps dhtml符号 定义导出的各种DOM属性和函数标识符 符号(区分大小写和不区分大小写的变体),您可以 可以导入到包中,以帮助防止像pageXOffset这样的符号 避免混淆。ps dhtml符号包包含 符号范围最广,最常用

如果使用模糊处理和外部JavaScript库,则可以使用 使用相同的技术定义您自己的包,并使用符号 不要混淆


Smackjack还生成对
setInterval
()的调用,但它不会从上述包中导入符号。这并不是一个真正的问题,因为这里只使用符号的名称,并且没有进行混淆。换句话说,
smackjack::set interval
ps window wd symbols:set interval
都映射到相同的Javascript函数。

使用此函数的最佳方法是在de defps宏中使用它

如代码中的文档注释所示,您可以找到:

;;这些是导出JS和浏览器DOM的便利包;; 符号。如果:使用包FOO中的包,然后;; 混淆FOO,它将阻止JS符号获得;;弄坏了

;;对于大多数web开发任务,您希望导入PS-JS-SYMBOL, ;; PS-WINDOW-WD-SYMBOLS(包括DOM级别2和w3c窗口 ;工作草图),可能还有PS-DOM-非标准符号

设置间隔函数由ps window wd symbols包导出,而不是用parenscript包导出

宏定义:

给定Parenscript表单(隐式程序),将这些表单编译为 宏扩展时的JavaScript字符串。扩展为 计算结果为字符串

看看:

(ql:quickload:parenscript)
(ql:quickload:cl who)
(ql:quickload:clack)
(包装内:ps)
(defvar*画布id*“外来画布”)
(咔哒声:咔哒声
(兰姆达(环境)
(名单200)
“(:内容类型“text/html”)
(名单
(who:html输出到字符串(*标准输出*nil:prologue t:indent t)
(:html)
(:头)
(:script:键入“text/javascript”
(世卫组织:fmt“~A”
(ps(defvar x 0)
(定义y 0)
(defvar dx 1)
(定义1)
(defvar img(新图像))
(setf(@img src)”http://www.lisperati.com/lisplogo_alien_128.png")
(设置间隔“draw()”5)
(取消抽签()
(let)(w 128)
(h 75)
(画布((@document-get-element-by-id)#*canvas-id*))
(如果(或(非画布)(非(@canvas get context)))
(返回值为假)
(let((ctx(@canvas get context)“2d”))
((@ctx fill rect)0 500 500)

(如果(和)(如果这些示例在代码中,您可以编译和运行,也许您可以使用slime来查找符号(
M-。
)的定义,这将为您提供符号所在位置的线索。您是否尝试过使用
(关于“设置间隔”)
?我是否正确理解您正在尝试查找导出此符号的程序包?您是否确定
(设置间隔a b)
通常不会将
a
作为函数(而不是字符串)而
b
数毫秒或者我不清楚apiApropos上的信息告诉我它是由Smackjack和~ps windows wd symbols~提供的。我将尝试重新混淆~ps windows wd symbols~并具体指定Smackjack。我已更新了主要问题。您将
放错第二个
使用Package中的位置ge
表单。我猜是打字错误。您的wellcome。我希望这对您有所帮助
    (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))))))))