Lisp:使用AND运算符的IF条件

时间:2017-02-06 16:55:59

标签: syntax lisp common-lisp

我正在制作这个功能。

(f 3 4) (sum = 7) 
(f 'a 'b) (not num!) 

我的问题是如果条件使用和运算符我该怎么做。

我试试......

  1. (IF (and (typep a 'integer) (typep b 'integer)) (1) (0))

  2. (IF (and ((typep a 'integer)) ((typep b 'integer))) (1) (0))

  3. (IF ((and ((typep a 'integer)) ((typep b 'integer)))) (1) (0))

  4. 但它不起作用。 (1)(0)我暂时设置它。

    我可以获得一些lisp语法帮助吗?

1 个答案:

答案 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 forms

((lambda (x) (+ x 4)) 5)
==> 9

但你还不用担心这些。