小编ˆᵛˆ*_*ˆᵛˆ的帖子

如何使用parenscript将Lisp列表设置为JavaScript变量的值?

我有:

(ps:ps (ps:var vertices (ps:lisp (cons 'list *VERTICES*))))
Run Code Online (Sandbox Code Playgroud)

其评估结果为:

"var vertices = [0.0, -200.0, 0, ... 0.4, 40];"
Run Code Online (Sandbox Code Playgroud)

这是正确的预期结果.

哪里:

  • ps指的是parenscript(完整文档在这里).

  • *VERTICES* 在我的全局Lisp环境中,它只是一个简单的数字列表


但是,当*VERTICES*大时,评估会导致错误:

错误:参数太多.在进程监听器(1)中执行:PARENSCRIPT :: COMPILE-SPECIAL-FORM.

我该如何解决这个错误?


不知道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;"
Run Code Online (Sandbox Code Playgroud)

没有正确的预期输出.

将Lisp列表变量的值传递给parenscript以形成正确的javascript数组变量赋值语句的正确方法是什么?

common-lisp parenscript

2
推荐指数
1
解决办法
76
查看次数

如何通过Clozure Common Lisp中的套接字进行通信?

在一个CCL REPL中,我输入:

(WITH-OPEN-SOCKET (socket :LOCAL-PORT 6667 
                          :LOCAL-HOST "localhost" 
                          :CONNECT :PASSIVE 
                          :REUSE-ADDRESS t)
  (let ((stream (ACCEPT-CONNECTION socket :wait t)))
    (format stream "hello from server.~%")))
Run Code Online (Sandbox Code Playgroud)

它等待连接.

在另一个CCL流程中,我输入:

(WITH-OPEN-SOCKET (socket-stream :REMOTE-PORT 6667 
                                 :REMOTE-HOST "localhost" 
                                 :CONNECT :ACTIVE 
                                 :REUSE-ADDRESS t)
    (format t (READ-LINE socket-stream)))
Run Code Online (Sandbox Code Playgroud)

此时此过程进入等待状态.它既不从服务器读取也不退出.

但是,当客户端连接到服务器时,服务器将以NIL退出.很明显,至少建立了一个连接,但字符串"Hello from server".永远不会沟通.

我相信这是我忽略的基本内容.如何发送消息?READ-LINE不是从流中读取的正确方法吗?我从服务器上写错了吗?如何建立基于双向简单字符串的通信?

sockets common-lisp buffered ccl

1
推荐指数
1
解决办法
203
查看次数

如何在Common Lisp中从宏参数创建单个单词?

我有:

(defmacro test (a b c)
    `'(,a ,b ,c))
Run Code Online (Sandbox Code Playgroud)

跑步(test apple banana cuba)给了(APPLE BANANA CUBA)预期.

如何让宏生成APPLEBANANACUBA?

我试过了:

(defmacro test (a b c)
        `'(,a,b,c))
Run Code Online (Sandbox Code Playgroud)

(test ant bites chris)仍然运行仍然返回(ANT BITES CHRIS)三个单独的args列表.

我试过变化,似乎没有工作.像这个:

(defmacro test (a b c)
    `(apply #'concatenate 'symbol '(,a ,b ,c)))
Run Code Online (Sandbox Code Playgroud)

显然,这会出错,因为'符号不是连接的有效输出类型.

我确信这是我对宏如何工作的一些基本误解,并且有一种简单的方法可以做到这一点.我错过了什么?

macros common-lisp

0
推荐指数
2
解决办法
67
查看次数

如何在Common Lisp中删除字符串中的转义双引号?

跑步(cl-json:encode-json-to-string 'ctx)"\"ctx\""

我需要的"ctx"不是"\"ctx\"".

我可以使用cl-ppcre并删除字符串中匹配的双引号.然而,这似乎有点矫枉过正.有没有其他方法可以做到这一点?

string common-lisp

0
推荐指数
1
解决办法
434
查看次数

为什么在编译函数定义时会对宏进行求值(Clozure Common Lisp)?

我有:

(defmacro assign (name value)
  (format t "assigning ~A to ~A~%" `,name `,value))

(defun opcode-call (&rest args)
  (mapcar (lambda (arg) 
             (if (stringp arg) 
                 (let ((var (gensym)))
                   (assign var arg)
                   var) 
                 arg)) 
          args))
Run Code Online (Sandbox Code Playgroud)

当我编译操作码调用时,REPL输出:

assigning VAR to ARG
OPCODE-CALL
Run Code Online (Sandbox Code Playgroud)

为什么在编译时对赋值进行求值?

common-lisp ccl lisp-macros

0
推荐指数
1
解决办法
45
查看次数

有没有办法在Common Lisp中更改文档字符串的分隔符?

我有时会将函数调用及其输出的示例放在函数定义的文档字符串中.

(defun js-[] (&rest args)
  "Javascript array literal statement.
  (js-[] 1 2 3)
  > \"[1, 2, 3]\"
  "
  (format nil "[~{~A~^, ~}]" (mapcar #'js-expr args)))
Run Code Online (Sandbox Code Playgroud)

但有时函数的输出是一个字符串.所以我必须在示例输出中转义双引号.这很快就变得单调乏味.

有没有办法将文档字符串分隔符从双引号更改为其他内容,以便我不必继续转义它们?

请注意,有时它比只逃避一次更糟糕:

(defun js-~ (str)
  "Javascript string statement. This is needed so that double quotes are inserted.
  (js-~ \"string\")
  > \"\\\"string\\\"\"
  "
  (format nil "\"~A\"" str))
Run Code Online (Sandbox Code Playgroud)

这里还有一个问题.阅读文档很困难.

documentation common-lisp

0
推荐指数
2
解决办法
144
查看次数