6

Lispで負の無限大を表す標準的な方法を探しています。Lispの算術関数によって他のすべての数値よりも小さいと認識されるシンブリック値はありますか?

具体的には、次のように書くためのエレガントな方法を探しています。

(defun largest (lst)
  "Evaluates to the largest number in lst"
  (if (null lst)
    ***negative-inifinity***
    (max (car lst) (largest (cdr lst)))))
4

2 に答える 2

7

ANSI Common Lispにはbignum、があります。これは、十分なスペースがある限り、任意の大きな数値を表すために使用できますが、「無限大」の値を指定しません。一部の実装は可能性がありますが、それは標準の一部ではありません。

あなたの場合、あなたはあなたの機能の目的に基づいてあなたのアプローチを再考しなければならないと思います:リストの中で最大の数を見つけること。ただし、空のリストで最大の数を見つけようとすることは無効/ナンセンスであるため、その場合に備えておく必要があります。したがって、前提条件を定義し、それが満たされない場合はnil、エラーを返すか発生させることができます。実際、これは組み込み関数maxが行うことです。

(apply #'max '(1 2 3 4)) => 4
(apply #'max nil) => error

編集: Rainer Joswigが指摘しているように、Common Lispは任意に長い引数リストを許可しないため、reduceの代わりに使用するのが最善ですapply

(reduce #'max '(1 2 3 4))
于 2011-12-12T13:58:39.463 に答える
3

ANSICommonLispにはそのようなものはありません。一般的なLisp実装(および数学アプリケーションでさえ)は、負の無限大の表現が異なります。

たとえば、ダブルフロートのLispWorksでは次のようになります。

CL-USER 23 > (* MOST-NEGATIVE-DOUBLE-FLOAT 10)
-1D++0
于 2011-12-12T13:56:44.540 に答える