我想更改列表的第n个元素并返回一个新列表.
我想到了三个相当不优雅的解决方案:
(defun set-nth1 (list n value)
(let ((list2 (copy-seq list)))
(setf (elt list2 n) value)
list2))
(defun set-nth2 (list n value)
(concatenate 'list (subseq list 0 n) (list value) (subseq list (1+ n))))
(defun set-nth3 (list n value)
(substitute value nil list
:test #'(lambda (a b) (declare (ignore a b)) t)
:start n
:count 1))
Run Code Online (Sandbox Code Playgroud)
这样做的最佳方式是什么?
Lisp闭包的经典示例是以下返回计数器的函数:
(defun make-up-counter ()
(let ((n 0))
#'(lambda () (incf n))))
Run Code Online (Sandbox Code Playgroud)
调用时,它会递增计数并返回结果:
CL-USER > (setq up1 (make-up-counter))
#<Closure 1 subfunction of MAKE-UP-COUNTER 20099D9A>
CL-USER > (funcall up1)
1
CL-USER > (funcall up1)
2
Run Code Online (Sandbox Code Playgroud)
当我向一个不熟悉Lisp的朋友展示这个时,他问我如何复制一个计数器来创建一个新的,相同类型的独立计数器.这不起作用:
CL-USER > (setq up2 up1)
#<Closure 1 subfunction of MAKE-UP-COUNTER 20099D9A>
Run Code Online (Sandbox Code Playgroud)
因为up2不是一个新的计数器,它只是同一个计数器的另一个名称:
CL-USER > (funcall up2)
3
Run Code Online (Sandbox Code Playgroud)
这是我最好的尝试:
(defun make-up-counter ()
(let ((n 0))
#'(lambda (&optional copy)
(if (null copy)
(incf n)
(let ((n 0))
#'(lambda () (incf n)))))))
Run Code Online (Sandbox Code Playgroud)
要返回计数器的副本,请使用参数t调用它:
(defun copy-counter (counter) (funcall counter t)) …Run Code Online (Sandbox Code Playgroud) 在 Lisp 中以独立于实现的方式移动文件的最佳方法是什么?例如我有一个图像文件:
(setq oldpath #P"SERVER:PICTURES;TEMP;PHOTO.PNG")
Run Code Online (Sandbox Code Playgroud)
我想将它从 TEMP 目录移到 PICTURES 目录中。这似乎有效:
(setq newpath
(make-pathname
:host (pathname-host oldpath)
:directory (butlast (pathname-directory oldpath))
:name (pathname-name oldpath)
:type (pathname-type oldpath)))
(rename-file oldpath newpath)
Run Code Online (Sandbox Code Playgroud)
但有更优雅的方式吗?
谢谢,大卫
我想使用Lisp的读取时间条件化功能来合并我的代码的两个版本,无论是旧的还是新的.我有类似的东西:
'(ant bee #+new cat #+new dog #+new eel fish)
Run Code Online (Sandbox Code Playgroud)
所以旧版本是:
'(ant bee fish)
Run Code Online (Sandbox Code Playgroud)
当定义功能new时,新版本是:
'(ant bee cat dog eel fish)
Run Code Online (Sandbox Code Playgroud)
有没有一种方式更简洁地写这个,只有一次#+ new?
以下JavaScript函数应该进行简单的JQuery调用来加载页面并设置一个类:
function Lp(page,class) {
$("#result").load(page);
$('#nav').attr('class',class);
}
Run Code Online (Sandbox Code Playgroud)
然而,直到预感,我改变了第二个参数的名称后才能工作:
function Lp(page,hilite) {
$("#result").load(page);
$('#nav').attr('class',hilite);
}
Run Code Online (Sandbox Code Playgroud)
当然参数名称是任意的,或者我错过了什么?
我正在创建一个哈希表来检查一个四个字母的单词是否有效:
function myClickHandler(myClickHandler)
{
var words4=new Array("abed", "abet", "able", "ably", "abut", "aces", "ache", "achy");
// Initialise hash table
var wordhash = new Array();
for (var i in words4)
{
wordhash[ words4[i] ] = true;
};
var text = wordhash['10'];
}
Run Code Online (Sandbox Code Playgroud)
但是,当我在调试器中检查哈希表时,第一个元素似乎是:
wordhash['10'] = true
Run Code Online (Sandbox Code Playgroud)
所以我的测试函数中的最后一个语句将变量text设置为true.为什么会这样?
谢谢