小编BnM*_*cGn的帖子

从REPL访问Hunchentoot请求对象以进行调试

我发现在编写Hunchentoot时,增量开发往往会中断.

例如,我可能会编写一个由几个函数组成的网页.如果其中一个内部函数包含调用 - 比如 - hunchentoot:post-parameters*那么我就不能轻易地在REPL中测试该函数.它会出错,因为*request*不存在,除非Web客户端调用该页面.

如果存在一些函数或其他源,那么我可以测试我的函数:

>(let* ((*request* (get-previous-request-from-somewhere))
       (*session* (slot-value *request* 'hunchentoot:session)))
    (my-function <whatever params>))
Run Code Online (Sandbox Code Playgroud)

它或类似的东西存在吗?我是否忽略了更好的调试方法?

lisp debugging common-lisp hunchentoot

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

列出scheme中的所有用户定义变量

在python我可以使用dir()和球拍(5.2)我可以做

 (require xrepl)
 ,apropos
Run Code Online (Sandbox Code Playgroud)

获取所有已定义变量的列表.在所有方案中都有什么便携方法可以做同样的事情?完成后,如何过滤掉所有系统和模块变量?完整的变量列表在球拍中相当令人生畏.

scheme racket

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

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

CLSQL中具有select函数的子查询

我正在尝试使用clsql:select函数创建子查询:

CL-USER> (select [books.bookid] 
         :from [books] 
         :where
           (sql-in [books.bookid]
               (select [bookid] 
                   :from [bookauthors]
                   :where 
                   (sql-= [bookauthors.authorid] 120))))
;; 2015-03-07T06:37:08 /books/ => SELECT BOOKID FROM BOOKAUTHORS WHERE (BOOKAUTHORS.AUTHORID = 120)
;; 2015-03-07T06:37:08 /books/ => SELECT BOOKS.BOOKID FROM BOOKS WHERE (BOOKS.BOOKID IN ((157)))
((157))
("bookid")
Run Code Online (Sandbox Code Playgroud)

它可以工作,但是clsql运行两个查询,而不是使用sub-select子句生成一个查询.这不会像让postgresql后端处理整个事情那样高效.

CL-USER> (clsql-sys:db-type-has-subqueries? :postgresql)
T
Run Code Online (Sandbox Code Playgroud)

显然postgresql连接器支持子查询.有没有办法让select函数生成它们?

postgresql common-lisp clsql

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

parenscript的宏扩展

parenscript宏是否等效于macroexpand或macroexpand-1?做(ps (some macro expression))会显示生成的javascript,但有时候在它转换为javascript之前看到parenscript会很高兴.

macros common-lisp parenscript

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

从球拍中的当前目录加载模块

euler.rkt我当前的工作目录中有一个文件.如何将其作为模块加载?

-> (require euler)
; readline-input:20:9: euler: standard-module-name-resolver: collection not
;   found: "euler" in any of: (#<path:/home/ben/.racket/5.2.1/collects>
;   #<path:/home/ben/racket/collects>) in: euler [,bt for context]
-> 
Run Code Online (Sandbox Code Playgroud)

我应该添加我的目录来收集吗?如果是这样,那么正确的方法是什么?

racket

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

有没有办法在 parenscript 代码中插入原始 javascript?

以下代码将第三方生成的 javascript 插入为需要评估的字符串。

(ps (let ((x (lisp (json:encode-json-alist-to-string
                 '((:a . 1) (:b . 2))))))))

"(function () {
   var x = '{\"a\":1,\"b\":2}';
    return null; })();"
Run Code Online (Sandbox Code Playgroud)

有没有办法告诉 parenscript 插入未加引号的字符串?

common-lisp parenscript

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

在emacs/slime实时环境中自动重新编译

鉴于这种情况:

(defmacro mac1 ...)

(defun func1 () 
  (mac1 ...))
Run Code Online (Sandbox Code Playgroud)

mac1在实时环境中重新定义在func1其自身重新编译之前不会受到影响.

有没有办法让emacs或lisp在重新编译func1时自动重新mac1编译?

在源代码中这样的东西是可以接受的:

(watch
  (defmacro mac1 ...))

(on-signal (mac1)
  (defun func1 ...))
Run Code Online (Sandbox Code Playgroud)

这并不难实现,但我宁愿避免重新发明.

emacs macros common-lisp slime

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

使用 swank/slime 在远程 Lisp 中加载本地文件

假设我使用 swank/slime 连接到远程 Lisp。我的本地计算机上的磁盘上或者 emacs 缓冲区中可能有一个数据文件。我想使用远程 Lisp 处理这个文件。

显然,我可以退出 shell 并将文件 scp 到服务器,加载文件,处理它,关闭,删除文件,这样我就不会在服务器上弄乱。

我还可以将文件粘贴到 repl 中:

> (defparameter *my-file* "[paste file here]")
Run Code Online (Sandbox Code Playgroud)

但如果文本中有引号或者文件是二进制的,这就很糟糕了。

这两种选择都很麻烦。

有没有一种好的方法可以让本地 emacs 将文件通过隧道传输到远程 Lisp,以便远程 Lisp 可以将其作为流打开?

我正在想象这样的事情:

> (swank:with-open-client-file (s #p"/path/to/local/file") ... )
Run Code Online (Sandbox Code Playgroud)

编辑:这个例子感觉它可能会在我的本地文件系统中打开一些漏洞。可以在不造成严重安全问题的情况下完成吗?

emacs common-lisp slime

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

Lisp阅读器中的关键字输入是否危险?

在Doug Hoyte的Let Over Lambda的第102页,作者说这是关于他的安全读取字符串函数:

这意味着向量,位向量,gensyms,循环引用,#.,以及所有其余的都出来了.Safe-read-from-string 甚至不允许使用关键字或外包符号.

我正在努力想到关键字符号的邪恶用法让我的大脑紧张.他们是为了方便而被排除在外还是可以用它们来做恶事?

security common-lisp

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

将?x样式模式变量转换为最佳值

这两个模式匹配示例中的最佳等价物是什么- 分别来自On Lisp和PAIP?

>(match ’(p a b c a) ’(p ?x ?y c ?x))
((?Y . B) (?X . A))
T


(difference between ?x* and ?y*)
Run Code Online (Sandbox Code Playgroud)

common-lisp pattern-matching

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

词法设置功能符号

我正在寻找一种方便的方法,暂时交换功能.我知道我可以像这样手动设置一个功能符号:

CL-USER> (setf (symbol-function 'abcd) #'+)
#<FUNCTION +>
CL-USER> (abcd 1 2 4)
7
Run Code Online (Sandbox Code Playgroud)

我也知道labels或者flet可以临时为已定义的函数设置名称:

CL-USER> (labels ((abcd (&rest x) 
                    (apply #'* x)))
            (abcd 1 2 4))
8
Run Code Online (Sandbox Code Playgroud)

有没有办法手动,词法设置功能名称?例如.:

CL-USER> (some-variant-of-labels-or-let ((abcd #'*))
            (abcd 1 2 4))
8
Run Code Online (Sandbox Code Playgroud)

注意:我尝试进入标签和flet的来源,但两者都是特殊的运算符.没有快乐.

common-lisp lexical-scope

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

在Common Lisp中为setf函数定义别名

根据这个问题,可以像这样创建函数的别名:

(defun some-function () ...)
(setf (fdefinition 'sfunc) #'some-function)
Run Code Online (Sandbox Code Playgroud)

但:

(defun some-function () ...)
(defun (setf some-function) () ...)
(setf (fdefinition 'sfunc) #'some-function)

> (setf (sfunc) ...)
; caught STYLE-WARNING:
;   undefined function: (SETF SFUNC)
Run Code Online (Sandbox Code Playgroud)

不为setf函数创建别名.如何为setf函数创建别名?

common-lisp

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