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

アーカイブの一覧に戻る
別所秀一 bes2h****@gmail*****
2022年 1月 30日 (日) 17:00:51 JST


はじめまして。GaucheやCommonLispを最近学び始めた別所と申します。
仕事はプログラミングとは無関係で、去年からCやPython入門書を読みはじめた初心者です。

いま、オライリーの「プログラミングGauche」」Land of Lisp」を並行して読んでいるところです。(どちらもまだ半分くらいです)

 Lispでは必要に応じて小さな関数をつくり、その出力を別の関数に与えたり、別の関数から呼び出してもらったりしながら問題を解決するんだなあ、と感じています。

で、その出力によく#<undef>がまじっていてエラーになります。

たとえば
gosh> (map (lambda (x) (if (odd? x) x)) '(1 2 3 4 5 6))
(1 #<undef> 3 #<undef> 5 #<undef>)

if で偽のときに#<undef>がやってくる?
(filter odd? '(1 2 3 4 5 6)) なら欲しかった(1 3 5)になります。

print すればいいのか
(for-each (lambda (x) (if (odd? x) (print x))) '(1 2 3 4 5 6)))
とすると、
1
3
5
#<undef>
となり、別の関数でこの出力を受けて、それぞれ2倍するみたいにやるとundefでエラーになります。
この場合はprintの評価値?

たとえば「Land of lisp」P111あたりの7章「グラフをつくる」ではnodes->dotのプリント出力をgraph->dotが受けてさらに加工して次の工程に送っています。
(defun nodes->dot (nodes)
  (mapc (lambda (node)
          (fresh-line)
          (princ (dot-name (car node)))
          (princ "[label=\"")
          (princ (dot-label node))
          (princ "\"];"))
        nodes))

(defun graph->dot (nodes edges)
  (princ "digraph{")
   1行省略
  (nodes->dot nodes)
  (princ "}"))

関数どうしをうまく組み合わせるためには、この#<undef>たちをどう扱うのがよいのでしょうか。よろしくお願いします。

それから、関数の連携とはちがいますが、
(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))
       (list a b c))))
これを実行してみると、
gosh> (三平方 20)
(#<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> ....)
こんなことになって、結果が確認できません。

以上、#<undef>での困りごとでした。



Gauche-devel-jp メーリングリストの案内
アーカイブの一覧に戻る