この時点で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
しかし、あなたはまだそれらを心配する必要はありません。
出典
2017-02-06 17:16:06
sds
数字のまわりの括弧を削除すると、最初のものが動作します( '(1)(0)'を '1 0'に変更してください)。 '(typep ... 'integer)の代わりに' integerp'を使用することもできます。 – jkiiski
ありがとうございます。 –
次回は、コードとエラーメッセージをコピーして貼り付けてください。エラーメッセージを理解する方法を教えてくれます。 – sds