2016-10-23 5 views
1

私はcommon-lispへの初心者のほうがずっと楽しかったです。しかし、私はハイパースペックや他の場所の文書がかなり明確であるので、マッパーとマップカンの違いを知っていると思います。原子上でのMapcanの動作

しかし、関数mapcanがリストを呼び出すと、要素はリストではなくアトムに評価されます。 mapcanはnconcを使ってリストを追加するので、リストがなければエラーが発生すると予想していました。

しかし、私は

(mapcan (lambda (x) (+ 2 x)) '(1 2 3 4)) 

をしようとした場合には、SBCLとCLISPに '6' と評価されます。 (この例は実用的ではないかもしれませんが、私は興味があります)値を返すのは単純なエラーよりも良いかもしれませんが、nconcにリストがない場合は、最後の値を返すmapcanについて何かを見つけることができます。

この現象が発生する理由はありますか?

+1

LispWorksとGCLからエラーが通知されます。 –

答えて

2

the documentation for mapcan(mapcan (lambda (x) (+ 2 x)) '(1 2 3 4))(apply #'nconc (mapcar (lambda (x) (+ 2 x)) '(1 2 3 4)))と同じにする必要があります。エラーがclispに入力されました。

ハイパースペックは、適切なリストを使ってnconcを実行し、最終的に前に引数としてnilを実行する必要があります。他に何も記述されていないので、sbclclispはおそらくパブリックドメインのlispのアルゴリズムを共有しているか、実装に特有の結果が同じように実装されているということです。

あなたはおそらく、あなたがmapcanに渡された関数は常にnconcthe specification内-edすることができ、新鮮なリストまたはnilを返すことを確認する必要がありますので、他の実装が同じことをするでしょう仮定することはできません。

関連する問題