[Gauche-devel-jp] #<undef>について

Back to archive index
別所秀一 bes2h****@gmail*****
2022年 1月 31日 (月) 13:31:52 JST


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で対応できました。



Gauche-devel-jp メーリングリストの案内
Back to archive index