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

Syntax Lisp:IF条件使用AND运算符,syntax,lisp,common-lisp,Syntax,Lisp,Common Lisp,我正在做这个函数 (f 3 4) (sum = 7) (f 'a 'b) (not num!) 我的问题是如何使用条件和运算符生成if 我试着 (如果(和(类型a'整数)(类型b'整数))(1)(0)) (如果(和((typep a'整数))((typep b'整数)))(1)(0)) (如果((和((typep a'整数))((typep b'整数)))(1)(0)) 但它不起作用。 (1) (0)是我临时设置的 我能得到一些lisp语法的帮助吗?现在你需要了解的关于lisp的最重要的事

我正在做这个函数

(f 3 4) (sum = 7) 
(f 'a 'b) (not num!) 
我的问题是如何使用条件和运算符生成if

我试着

  • (如果(和(类型a'整数)(类型b'整数))(1)(0))

  • (如果(和((typep a'整数))((typep b'整数)))(1)(0))

  • (如果((和((typep a'整数))((typep b'整数)))(1)(0))

  • 但它不起作用。 (1) (0)是我临时设置的


    我能得到一些lisp语法的帮助吗?

    现在你需要了解的关于lisp的最重要的事情是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)
    
    注意格式和缩进。 Lisper通过缩进而不是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.
    
    或:


    但是您还不必担心这些问题。

    现在您需要了解的关于Lisp的最重要的事情是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)
    
    注意格式和缩进。 Lisper通过缩进而不是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.
    
    或:


    但是您还不需要担心这些问题。

    当您删除数字周围的括号时,第一个应该会起作用(将
    (1)(0)
    更改为
    10
    )。您也可以使用
    integerp
    而不是
    (typep…'integer)
    谢谢您的回复。下次请复制并粘贴您的代码和收到的错误消息。我们会教你如何理解错误信息。我会的。谢谢您的建议。当您删除数字周围的括号(将
    (1)(0)
    更改为
    1 0
    )时,第一个应该有效。您也可以使用
    integerp
    而不是
    (typep…'integer)
    谢谢您的回复。下次请复制并粘贴您的代码和收到的错误消息。我们会教你如何理解错误信息。我会的。谢谢你的建议。