COMMON LISP JP > Archives > 2011/08/22

2011/08/22 14:18:07 UTCbugyo
#
こんばんはdoマクロと多値を返す関数の相性が非常に悪いんですが、うまい方法はないものでしょうか。
2011/08/22 14:25:14 UTCllibra
#
doとかreduceとかは多値との相性が悪いんで、専用のマクロとかを書いてる人は見たことがあります。どこかのユーティリティライブラリに収録されていた気がしますが、うろ覚えです。
#
自分は普通に再帰で書いてますが、他の人がどうやってるのかは自分も気になります。
2011/08/22 14:38:52 UTCbugyo
#
なるほど。再帰ならすっきりしますね。ただ、できるだけループで書きたいんですよね。
2011/08/22 14:39:36 UTCllibra
#
性能的な問題ですか?
2011/08/22 14:40:23 UTCbugyo
#
スタックサイズの問題です。
#
いまは、doのbodyでmultiple-value-setqという事態になっていて
2011/08/22 14:41:53 UTCllibra
#
なるほど。自分の書いたケースだと、TCOが効くので問題にはならなかったですけど、そうできないケースは厳しいんでしょうね。
2011/08/22 14:46:16 UTCllibra
#
コードを提示していただければ、誰か良いアイデアを出してくれるかもしれませんよー。
2011/08/22 15:08:56 UTCbugyo
#
(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))
#
いまは、こんな感じです。
2011/08/22 15:56:27 UTCllibra
#
そのケースなら、doの変数名の部分にconsを許すようにして、consの場合は上のようなコードに展開するマクロを書けば良いと思います。擬似的な分配束縛ということで。
2011/08/22 16:05:42 UTCbugyo
#
いい案ですね。作ってみます。