gpt4 book ai didi

LISP 条件编程

转载 作者:太空宇宙 更新时间:2023-11-03 19:03:46 25 4
gpt4 key购买 nike

我正在尝试编写一个非常简单的程序,但虽然我无法弄明白,但请帮忙假设我们有 10 个圆圈,每个圆圈都有 X、Y、Z、r该程序将采用这些变量(x、y、z、r)并找出哪一对圆可以构成一个圆柱体(换句话说,哪些圆具有相同的 x、y、r(但不相同的 z))我应该使用什么样的命令? “条件如果……否则如果”


这是第一个代码:

(setq a 10)
(setq b 10)
(setq c 11)
(setq d 12)
(cond ((= a b) (cond ( (= b c) (print 'a=b=c) ) )
(> a b) (print 'a>b)
(< a b) (print 'a<b))
)

我正在尝试将一个 COND 用作另一个 COND 中的一个 Action ,因此如果它们相同,我可以搜索这些数字,但似乎 lisp 不像 C 那样接受它......

最佳答案

你当然可以嵌套cond随心所欲:

(defun funny-compare (a b c)
(cond ((= a b)
(cond ((= a c) 'all-equal)
(t 'only-two-equal)))
((< a b) 'less)
((> a b) 'greater)))

这里有一些例子:

CL-USER> (funny-compare 1 1 1)
;;=> ALL-EQUAL
CL-USER> (funny-compare 1 1 2)
;;=> ONLY-TWO-EQUAL
CL-USER> (funny-compare 1 2 2)
;;=> LESS
CL-USER> (funny-compare 2 1 2)
;;=> GREATER

您只需要注意将相应的子句放入正确的 cond 中即可.自动缩进(以及匹配的括号和其他一些视觉辅助)使这变得非常微不足道。使用您在上面提供的代码并让 emacs 格式化它给我:

(cond ((= a b) (cond ( (= b c) (print 'a=b=c)  )  )
(> a b) (print 'a>b)
(< a b) (print 'a<b))
)

仔细观察,可以看到所有的s-expressions,都是以(= a b)开头的最多 (< a b)(print 'a<b)位于同一组括号中:分隔外部 cond 的括号.因此,所有这些表达式都是第一个案例的一部分,因此您只有一个案例。

你要的是这个:

(cond ((= a b)
(cond ((= b c)
(print 'a=b=c))))
(> a b) (print 'a>b)
(< a b) (print 'a<b))

仔细观察缩进!

但是解决您最初的问题:您应该尝试在您的代码中表达您想要编程的想法。你写了关于“圆圈”之类的东西,但你的代码没有表达任何这些( abc 等很少是好名字)。

首先将您的圆圈想法写入代码:

(defun make-circle (x y z r)
(list x y z r))
(defun circle-x (circle)
(first circle))
(defun circle-y (circle)
(second circle))
(defun circle-z (circle)
(third circle))
(defun circle-radius (circle)
(nth 3 circle))

然后,你要检查的是多个独立的条件。你不需要多个 cond为此,事实上,用 and 显式要好得多:

(cond ((and (= (circle-x one) (circle-x other))
(= (circle-y one) (circle-y other))
(= (circle-radius one) (circle-radius other))
(not (= (circle-z one) (circle-z other))))
'planar-not-same-but-on-axis-parallel-to-z))

请注意,这不是惯用的 lisp,因为写了很多本质上没有必要的东西,我们需要重复很多次。有很多工具( defclassdefstruct 、访问器函数、 with-slots ……)可以用来缩短这个时间。感谢列表的强大功能,我们甚至可以摆脱重复使用 =。 :

(flet ((extract (circle)
(list (circle-x circle)
(circle-y circle)
(circle-radius))))
(when (and (every #'= (extract one) (extract other))
(not (= (circle-z one) (circle-z other))))
'planaer-not-same-but-on-axis-parallel-to-z))

请注意,我还去掉了 cond , 因为 cond只有一个案例并不是很好的代码风格:只有当你有两个以上的分支时才使用它(对于两个分支使用 if )。

我希望这对您有所帮助。

关于LISP 条件编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33725423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com