どのようにして、同じ関数に対してオプションの引数とキーワード引数を持たせることができますか?

私はオプションとキーワード引数を取ることができるLisp関数を書こうとしています。関数が始まります

(defun max-min (v &optional max min &keyword (start 0) (end nil))

オプションの引数ではなくキーワードの引数を使用して関数を呼び出そうとすると、エラーが発生します。私がしようとしているのは、

(max-min #(1 2 3 4) :start 1 :end 2)

I’m getting the error Error: :START' is not of the
expected type REAL'

これは、max
にバインドしようとしているためです。これをどのように機能させることができますか?ありがとう。

ベストアンサー

必要なパラメータ、オプションのパラメータ、キーワードパラメータを使用してその関数を呼び出す必要があります。そうでなければどのように動作するのでしょうか?あなたのコールにはオプションのパラメータがありません。コールでキーワードパラメータを指定する場合、オプションはもはやオプションではありません。

(max-min #(1 2 3 4) 0 100 :start 1 :end 2)

基本スタイルルール:

関数内でキーワードパラメータとオプションを混在させないでください。例えば、Common
Lispはある場所でそれを使用し、バグの原因となります。

CL:READ-FROM-STRING is such an example.

read-from-string string
                 &optional eof-error-p eof-value
                 &key start end preserve-whitespace

http://www.lispworks.com/documentation/HyperSpec/Body/f_rd_fro.htm

これは動作します:

(read-from-string " 1 3 5" t nil :start 2)

これはまた動作するかもしれません:

(read-from-string " 1 3 5" :start 2)

しかし、ユーザーはEOF-ERROR-PとEOF-VALUEを指定するのを忘れていました。
Lispコンパイラは不平を言っていないかもしれないし、なぜ2で始まるのか不思議に思うだろう。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です