#こんばんはdoマクロと多値を返す関数の相性が非常に悪いんですが、うまい方法はないものでしょうか。
#doとかreduceとかは多値との相性が悪いんで、専用のマクロとかを書いてる人は見たことがあります。どこかのユーティリティライブラリに収録されていた気がしますが、うろ覚えです。
#自分は普通に再帰で書いてますが、他の人がどうやってるのかは自分も気になります。
#なるほど。再帰ならすっきりしますね。ただ、できるだけループで書きたいんですよね。
#性能的な問題ですか?
#スタックサイズの問題です。
#いまは、doのbodyでmultiple-value-setqという事態になっていて
#なるほど。自分の書いたケースだと、TCOが効くので問題にはならなかったですけど、そうできないケースは厳しいんでしょうね。
#コードを提示していただければ、誰か良いアイデアを出してくれるかもしれませんよー。
#(defun mpi (number radix len &aux ret)
"return list of integer what represents multiple-precision integer of <number>."
(do ((q 0)
(r number)
(len len (1- len)))
((= len 0) nil)
(multiple-value-setq (q r) (floor r (expt radix len)))
(format t "~a~%" q)
(push q ret))
(reverse ret))
#いまは、こんな感じです。
#そのケースなら、doの変数名の部分にconsを許すようにして、consの場合は上のようなコードに展開するマクロを書けば良いと思います。擬似的な分配束縛ということで。
#いい案ですね。作ってみます。