2017-02-06 2 views
1

이 함수를 만듭니다.Lisp : AND 연산자를 사용하는 IF 조건

(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. 는하지만 그것은 작동하지 않습니다. (1) (0) 일시적으로 설정했습니다.

      일부 리스프 구문 도움말을 얻을 수 있습니까?

    +1

    첫 번째 것은 숫자 주위에 괄호를 제거 할 때 작동합니다 ('(1) (0)'을 '1 0'으로 변경). '(typep ... '정수) 대신'integerp'를 사용할 수도 있습니다. – jkiiski

    +0

    답장을 보내 주셔서 감사합니다. –

    +0

    다음 번에 코드와 오류 메시지를 복사하여 붙여 넣으십시오. 오류 메시지를 이해하는 방법을 알려 드리겠습니다. – sds

    답변

    5

    이 순간에 Lisp에 대해 배워야 할 가장 중요한 것은 내용이입니다.

    C에서는 1+3, (1)+3, (((1+3)))을 쓸 수 있으며 모두 같은 의미입니다. 혀짤배기에서 그들은 매우 매우 다르다 :

    • a "는 변수 이름 a의 가치"를 의미한다.
    • (a)은 "함수의 반환 값이며 아무런 인자없이 호출 된 a"을 의미합니다.
    • ((a))
    • 구문 오류입니다 (하지만 PPS 참조)

    그래서, ((...))와 모든 버전은 크게 잘못된 것입니다.

    1이라는 함수가 없으므로 첫 번째 버전도 좋지 않습니다.

    는 당신이 필요로하는 것은 :

    (if (and (typep a 'integer) 
         (typep b 'integer)) 
        1 
        0) 
    

    참고 서식 및 들여 쓰기. Lispers는 들여 쓰기 코드를 이 아니고이 아니므로 적절한 들여 쓰기가 중요합니다. Emacs (그리고 다른 Lisp 특정 IDEs)가 lisp 코드를 들여 쓰기를합니다.

    추신. 당신이 달성하려고하는 무엇에 대한 설명은 불분명하지만, 가장 쉬운 방법은 일반적인 기능을 사용하는 것입니다 수 있습니다 :

    (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 
    

    하지만 아직 이들에 대해 걱정할 필요가 없습니다.

    +0

    메모는 학습에 도움이되었습니다. 답변 주셔서 감사합니다. –

    +0

    당신은 환영합니다. 계속 물어봐! – sds