在Common Lisp中的值是否只是用于将多个值打包到一个被调用者解构的列表中的语法糖?我问,因为我认为Common Lisp支持"true"多值返回,而不是像其他语言一样返回元组或列表,例如python.有人告诉我,这只是语法糖,所以我希望有人能够解释它.为了尝试理解values函数返回的类型,我输入了(type-of (values 1 2 3)),输出是BIT.我在Common Lisp参考中搜索了这个,我在数据类型部分找不到它.此外,任何人都可以共享一些资源,建议如何在Common Lisp中实现值函数?谢谢.
我目前正在阅读Paul Graham的ANSI Common Lisp,我有一个关于编写lambda表达式的问题.
我们需要在lambda表达式前加上#'?如果我在REPL中写这样的东西,它会正常工作
> ((lambda (x) (+ x 1)) 1)
2
Run Code Online (Sandbox Code Playgroud)
这样也会
> (mapcar (lambda (x) (+ x x)) '(1 2 3 4))
(2 4 6 8)
Run Code Online (Sandbox Code Playgroud)
我明白这#'表示一个功能.所以我的问题是,它是某种惯例还是推荐的做法?如果我不为lambdas添加前缀#',可能出现任何问题,是否依赖于实现?
我已经编写了一个迭代加深算法,除非我添加循环检查,否则算法会返回一个比它应该更深的解决方案.但是当我没有检查周期时它确实可以正常工作,但这需要很长时间.任何人都可以发现这个bug吗?
(defun rec-depth-limited (problem node cutoff closed)
(if (= cutoff 0)
(if (funcall (problem-goalp problem) node)
node)
(if (visited-p node closed)
nil
(progn
;; when i remove the next line, it works correctly
(setf (gethash (node-state node) closed) t)
(loop for child in (expand node (problem-actions problem)) do
(let ((result (rec-depth-limited problem child (1- cutoff) closed)))
(if result
(return result))))))))
(defun iterative-deepening (problem)
"Iterative deepening search"
(let ((cutoff 0))
(loop
(format t "~%cut-off: ~A" cutoff)
(let ((solution (rec-depth-limited
problem
(make-node …Run Code Online (Sandbox Code Playgroud) 我有一个结构列表,我想编写一个函数来改变结构中的一些插槽而不影响原始列表.我尝试使用copy-list,但它不够深入; 插槽值也在原始列表中更改.我的问题是,是否有内置函数可以完成我想要的操作?或者我应该编写自己的函数?谢谢.
编辑:
我接着编写了自己的函数,是否有一个可以执行此操作的内置函数?
(defun deep-copy (li)
(if (null li)
nil
(cons (copy-structure (car li)) (deep-copy (rest li)))))
Run Code Online (Sandbox Code Playgroud) 我已经编写了使用3x3平均滤波器来平滑图像的代码,但是输出很奇怪,它几乎都是黑色的.这是我的代码.
function [filtered_img] = average_filter(noisy_img)
[m,n] = size(noisy_img);
filtered_img = zeros(m,n);
for i = 1:m-2
for j = 1:n-2
sum = 0;
for k = i:i+2
for l = j:j+2
sum = sum+noisy_img(k,l);
end
end
filtered_img(i+1,j+1) = sum/9.0;
end
end
end
Run Code Online (Sandbox Code Playgroud)
我把这个函数调用如下:
img=imread('img.bmp');
filtered = average_filter(img);
imshow(uint8(filtered));
Run Code Online (Sandbox Code Playgroud)
到目前为止,我在代码逻辑中看不出任何错误,如果有人能够发现问题,我会很感激.
我在google搜索时发现了这个lisp功能
(defun filter (lst items-to-filter)
(cond ((null lst) nil)
((member (car lst) items-to-filter) #1=(filter (cdr lst) items-to-filter))
(t (cons (car lst) #1#))))
Run Code Online (Sandbox Code Playgroud)
它只是设置差异,但这是我第一次看到#1 =和#1#,语法.我想通过查看代码我明白它意味着什么,但我不太确定.我认为#1 =用于标记表达式,以便以后在需要时不再重新键入它,可以通过#index#引用它,在这种情况下index = 1.我想知道是否有人可以对此有所了解.这些构造的名称是什么,如果有它们的引用,以及它们是否被广泛用于现代的lisp代码中.谢谢
我有一个函数列表,一个元素列表,我想在所有元素上应用所有函数,然后将所有结果列表附加在一起.我按照以下方式做到了
(defun apply-functions(funcs elements)
(if (null funcs)
nil
(append (mapcar #'(lambda (x) (funcall (car funcs) x)) elements) (apply-functions (rest funcs) elements))))
Run Code Online (Sandbox Code Playgroud)
它按预期工作,但我不喜欢它.这样做有更干净,更简洁的方法吗?我是lisp的新手,并且仍然习惯于lispish做事.
所以我是哈斯凯尔的新手,我已经玩了一段时间了.我想让我的函数输出所有列表排列工作.我写了2个实现,一个很好用,另一个给我一个错误.任何帮助都是极好的.
这是第一个(工作)实现:
permute [] = [[]]
permute xs = [y| x <- xs, y <- map (x:) $ permute $ delete x xs]
Run Code Online (Sandbox Code Playgroud)
这个给我一个错误:
permute [] = [[]]
permute xs = map (\x -> map (x:) $ permute $ delete x xs) xs
Run Code Online (Sandbox Code Playgroud)
这是错误信息:
Occurs check: cannot construct the infinite type: t0 = [t0]
Expected type: [t0]
Actual type: [[t0]]
In the expression: map (x :) $ permute $ delete x xs
In the first argument of `map', namely
`(\ …Run Code Online (Sandbox Code Playgroud) common-lisp ×6
list ×3
clisp ×1
copy ×1
haskell ×1
lambda ×1
lisp ×1
matlab ×1
permutation ×1
struct ×1