Shiro Kawai 様、ありがとうございます。作者じきじきに回答いただき、感激です。 これも「Land of lisp」P.127,128の例で、少し単純化したものです。 edge-pair で(1.5) (5.1)のように数値で表されたnodeをつなぐedgeをつくっていますが、rondamな数値から作っているので同じ数になった場合はNILが返ります。 受け取るmake-edge-listのほうのcollectは多分、appendで、lispではNIL = '()なのでほしい結果だけ集まるのだと思います。 (defun edge-pair (a b) (unless (eql a b) (list (cons a b) (cons b a)))) (defun make-edge-list () (apply #'append (loop repeat 10 collect (edge-pair (random 10) (random 10))))) これをGaucheで書く場合は、(eql a b)のとき は '()を返すように付け加えればうまくいきました。 でも送り先がappend でない場合はどうすれば? 数値のリストが欲しいけど (0 #<undef> 4 #<undef> 16 #<undef> 36 64 ) みたいに #<undef>が混じっているかもしれない場合、 受け取る側で (filter number? list) というふうにfilterでつつんでやればいいのでしょうか。 Pythonでも試してみましたが同じような結果でしたので、「真の場合の処理しか書いてないのになぜ?」というのは初心者の思い込みのようです。 >>> def oddp (x): ... if x % 2 == 1: ... return x ... >>> (list (map (oddp, [1,2,3,4,5,6]))) [1, None, 3, None, 5, None] 三平方については、なるほどです。 これ、間違ったままでも#<undef>の海の中に答えも混じってるんです。 gosh> (三平方 6) (#<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> (3 4 5)) 間違ったままで、評価してほしい(list a b c)を(print )でつつむと、 (define (三平方 n) (list-ec (: a 1 n) (: b (+ a 1) n) (: c (+ b 1) n) (if (= (+ (expt a 2) (expt b 2)) (expt c 2)) (print (list a b c))))) gosh> (三平方 20) (3 4 5) (5 12 13) (6 8 10) (8 15 17) (9 12 15) (#<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> #<undef> ....) というふうに答えも出るので間違いに気づきませんでした。 はっきりエラーにして欲しいところです。 repl の出力って省略されないようにする方法はありますか? デバッグプリントではdebug-print-widthで対応できました。