我正在制作这个功能。
(f 3 4) (sum = 7)
(f 'a 'b) (not num!)
我的问题是如何使用和运算符创建 if 条件。
我试试....
(IF (and (typep a 'integer) (typep b 'integer)) (1) (0))
(IF (and ((typep a 'integer)) ((typep b 'integer))) (1) (0))
(IF ((and ((typep a 'integer)) ((typep b 'integer)))) (1) (0))
但它不起作用。 (1)(0)是我临时设置的。
我能得到一些 lisp 语法方面的帮助吗?
最佳答案
此刻你需要了解 Lisp 的最重要的事情是parens matter。
在 C 中,您可以编写 1+3
、(1)+3
、(((1+3)))
并且它们都是同一个意思。在 lisp 中,它们非常不同:
a
表示“名为a
的变量的值”。(a)
表示“名为a
的函数 的返回值调用时没有任何参数”。((a))
是句法错误(但见PPS)
因此,每个带有 ((...))
的版本都是完全错误的。
因为没有名为1
的函数,所以第一个版本也不好。
你需要的是:
(if (and (typep a 'integer)
(typep b 'integer))
1
0)
注意格式和缩进。 Lispers 通过缩进阅读代码,不是括号,因此正确的缩进很关键。 请注意,Emacs(可能还有其他一些特定于 Lisp 的 IDE)会为您缩进 lisp 代码。
PS.您试图完成的描述不清楚,但最简单的方法可能是使用通用函数:
(defgeneric f (a b)
(:method ((a integer) (b integer))
(+ a b)))
(f 1 2)
==> 3
(f 1 'a)
*** - NO-APPLICABLE-METHOD: When calling #<STANDARD-GENERIC-FUNCTION F> with
arguments (1 A), no method is applicable.
PPS. 最终您会看到合法的 ((...) ...)
,例如 cond
:
(defun foo (a)
(cond ((= a 1) "one")
((= a 2) "two")
(t "many")))
(foo 1)
==> "one"
(foo 3)
==> "many"
或lambda forms :
((lambda (x) (+ x 4)) 5)
==> 9
但您现在还不需要担心这些。
关于syntax - Lisp:使用 AND 运算符的 IF 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42073168/