我发现在编写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)
它或类似的东西存在吗?我是否忽略了更好的调试方法?
在python我可以使用dir()和球拍(5.2)我可以做
(require xrepl)
,apropos
Run Code Online (Sandbox Code Playgroud)
获取所有已定义变量的列表.在所有方案中都有什么便携方法可以做同样的事情?完成后,如何过滤掉所有系统和模块变量?完整的变量列表在球拍中相当令人生畏.
我正在尝试使用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函数生成它们?
parenscript宏是否等效于macroexpand或macroexpand-1?做(ps (some macro expression))会显示生成的javascript,但有时候在它转换为javascript之前看到parenscript会很高兴.
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)
我应该添加我的目录来收集吗?如果是这样,那么正确的方法是什么?
以下代码将第三方生成的 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 插入未加引号的字符串?
鉴于这种情况:
(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)
这并不难实现,但我宁愿避免重新发明.
假设我使用 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)
编辑:这个例子感觉它可能会在我的本地文件系统中打开一些漏洞。可以在不造成严重安全问题的情况下完成吗?
在Doug Hoyte的Let Over Lambda的第102页,作者说这是关于他的安全读取字符串函数:
这意味着向量,位向量,gensyms,循环引用,#.,以及所有其余的都出来了.Safe-read-from-string 甚至不允许使用关键字或外包符号.
我正在努力想到关键字符号的邪恶用法让我的大脑紧张.他们是为了方便而被排除在外还是可以用它们来做恶事?
这两个模式匹配示例中的最佳等价物是什么- 分别来自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) 我正在寻找一种方便的方法,暂时交换功能.我知道我可以像这样手动设置一个功能符号:
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的来源,但两者都是特殊的运算符.没有快乐.
根据这个问题,可以像这样创建函数的别名:
(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 ×11
emacs ×2
macros ×2
parenscript ×2
racket ×2
slime ×2
clsql ×1
debugging ×1
hunchentoot ×1
lisp ×1
postgresql ×1
scheme ×1
security ×1
string ×1