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

标签 syntax lisp common-lisp

我正在制作这个功能。

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

我的问题是如何使用和运算符创建 if 条件。

我试试....

  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))

但它不起作用。 (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/

相关文章:

arrays - 如何比较 BASH 中的数组元素?

go - 一个 Timer 有一个名为 C 的 chan 字段。要返回它,我必须在它后面加上括号吗?

javascript - 如何从 JSCL 方法调用 Common Lisp 代码

windows - 为什么我无法安装 quicklisp? ("Package QUICKLISP-QUICKSTART does not exist")

c++ - 除了使 TMP 编译之外,::template 意味着什么

PHP 语法错误 “unexpected $end”

lisp - Racket 中的单例 (LISP)

lambda - 为什么要尖锐地引用 lambda 表达式?

list - 检查 clisp 中的模式列表

function - 在 common-lisp 中,如何在不更改原始列表的情况下从函数中修改部分列表参数?