2017-02-06 9 views
1

この関数を作っています。Lisp:AND演算子を使ったIF条件

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

しかし、それは動作しません....てみてください。 (1)(0)は一時的に設定しています。

私はいくつかのlisp構文のヘルプを得ることができますか?

+1

数字のまわりの括弧を削除すると、最初のものが動作します( '(1)(0)'を '1 0'に変更してください)。 '(typep ... 'integer)の代わりに' integerp'を使用することもできます。 – jkiiski

+0

ありがとうございます。 –

+0

次回は、コードとエラーメッセージをコピーして貼り付けてください。エラーメッセージを理解する方法を教えてくれます。 – sds

答えて

5

この時点でLispについて学ぶ必要がある最も重要なことは、の括弧はです。

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 

しかし、あなたはまだそれらを心配する必要はありません。

+0

ノートは学習に役立ちました。答えてくれてありがとう。 –

+0

あなたは大歓迎です。求め続けます! – sds