今日は休み

を取ってます。子守名目ですので特にヤる事もなし。昼メシ終了後、検討再開。
util.match とか string-split という武器をげっちゅうして意気や良し。と言いつつ

	     ((_ _ _ "127.0.0.1:161" _) #t)

みたいな書き方はもう少しなんとかならんかな、と。

などと言ってたら shiro さんからフォローが。gauche ワケワカって使ってないのがバレバレなのでしょうけどドンマイ、ってコトでコメントには

  • util.match を持ち出した意図は null のチェックが不要になるということ
  • 以下なソレで null? なチェックして car とってきてな手続きが省ける
(match (process-output->string-list ...)
 [(x . _) (rxmatch-if (#/:161/ x) ...)])
  • 正規表現使うなら process-output->string を使うという手も

ちょうど良いので色々いぢくり回してやれ。

とりあえずでっち上げたのが以下

(define (port-check)
  (let f ((l (process-output->string-list '(netstat -n --all))))
    (match l
	   ((x . _) (rxmatch-if (rxmatch #/:161 / x) ()
				#t
				(f (cdr l))))
	   (else #f))))

(define main
  (lambda (args)
    (if (port-check)
	0
	1)))

随分すっきり。おそらく shiro さんは繰り返しもウザいんでリストじゃなく文字列にしちゃえば繰り返しはいらないんじゃね?という事を言われてたのかな。

#!/usr/bin/gosh

(use gauche.process)
(use util.match)

(define (port-check)
  (rxmatch-if (rxmatch #/:161 /
		       (process-output->string '(netstat -n --all)))
		       ()
		       #t
		       #f))

(define main
  (lambda (args)
    (if (port-check)
	0
	1)))

あらまー。てーかこれって

(define (port-check)
  (rxmatch #/:161 / (process-output->string '(netstat -n --all))))

で良いのか。ポート監視なソレは match-expr を辞書みたいな形で持っとけばなんとかなりますな。わははは。