我正在制作这个功能。
(f 3 4) (sum = 7)
(f 'a 'b) (not num!)
我的问题是如果条件使用和运算符我该怎么做。
我试试......
(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语法帮助吗?
答案 0 :(得分:5)
此时您需要了解的最重要的事情是 parens重要。
在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通过缩进读取代码, not parens,因此适当的缩进是至关重要的。 请注意,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 (x) (+ x 4)) 5)
==> 9
但你还不用担心这些。