0

例えば、

(cond ((< 2 1) 2 )((< 1 2 ) 1)) の値は 1 です。

しかし、(cond (diverge 1) (ture 0))私の主要な本で、分岐が終了しない場合、それは未定義であることがわかりました。

Lispの発散は何ですか??

私はそれを知りません。

また、Lisp の副作用が正確にはわかりません。

4

2 に答える 2

4

あなたが最初に意図したコードが

(cond ((diverge 1) (ture 0)))

divergeその場合、その式の結果は、その名前が示すように発散操作であると仮定すると、未定義です (または、より良い発散も) 。

発散操作は、たとえば無限ループのように、結果に収束しない操作です。

divergeCommon Lisp 標準には定義がありません(実用的な目的は何ですか?)。そのため、あなたの本では、発散計算を操作でラップして適切な名前を付けることで、発散計算の「実装の詳細」を省略しているだけです。

diverge元のコードがシンボル マクロであると仮定した場合、同じ動作が発生する可能性があることに注意してください。

于 2016-03-28T07:04:53.797 に答える
2

示されているように、divergeブールture値として評価される変数に名前を付けます。式全体の値は、真の場合は 1、diverge真の場合は 0、どちらも真tureでない場合は0 です。nil

divergeコンテキスト、特にとがどのようtureにバインドされているかを示していないため、スニペットについてこれ以上言うことはできません。

多分あなたはのようなものを意味しました(cond ((diverge 1) (ture 0)))。その後diverge、オペレーターになります。それは Common Lisp 標準では定義されていないので、あなたの本のどこかから来ている可能性が高いです。

于 2016-03-27T08:01:23.873 に答える