gpt4 book ai didi

lisp - 使用 parenscript 设置间隔函数

转载 作者:太空宇宙 更新时间:2023-11-03 18:47:14 28 4
gpt4 key购买 nike

我见过很多例子,其中 (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-. 在我的主项目命名空间中返回“No known Symbol”。

最佳答案

使用此函数的最佳方法是在 defmacro ps 中使用它。

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

;; These are convenience packages that export JS and browser DOM ;; symbols. If you :use the packages in a package FOO and then ;; obfuscate FOO, it will prevent the JS symbols from getting ;; mangled.

;; For most web development tasks, you want to import PS-JS-SYMBOLS, ;; PS-WINDOW-WD-SYMBOLS (which includes DOM level 2 and the w3c Window ;; working draft), and possibly the PS-DOM-NONSTANDARD-SYMBOLS.

并且 set-interval 函数是由 ps-window-wd-symbols 包导出的,而不是 parenscript 包导出的

defmacro ps:

"Given Parenscript forms (an implicit progn), compiles those forms to a JavaScript string at macro-expansion time. Expands into a form which evaluates to a string.

看看the following gist :

    (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))))))))

关于lisp - 使用 parenscript 设置间隔函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45271160/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com