定規のようなもの

30分プログラム、その734。http://gauc.no-ip.org/awk-users-jp/blis.cgi/DoukakuAWK_260にインスパイアされて、バールのようなもの、もとい定規のようなものを作ってみました。
stty -aで画面の幅を取得してるんですが、そのためには標準入力が端末につながっている必要があります。最終的に/dev/ttyに辿りつくまで、けっこうな試行錯誤がありました。

  • process-output->stringの:outputに(standard-input-port)を指定しようとする。が、文字列でないとダメと言われて挫折する
  • sys-pipe/sys-fork-and-execを使おうとする。とりあえず動くようになるが、結構複雑。
  • /dev/ttyでよくね!

使い方

$ gosh ruler.scm
---------+---------+---

ソースコード

#! /opt/local/bin/gosh
;; -*- mode:scheme; coding:utf-8 -*-
;;
;; ruler.scm -
;;
;; Copyright(C) 2010 by mzp
;; Author: MIZUNO Hiroki / mzpppp at gmail dot com
;; http://howdyworld.org
;;
;; Timestamp: 2010/02/09 20:15:55
;;
;; This program is free software; you can redistribute it and/or
;; modify it under MIT Lincence.
;;
(use srfi-1)
(use gauche.process)

(define regexp #/(\d+) columns/)
(define (column)
  (string->number
   (rxmatch-substring
    (rxmatch regexp (process-output->string '(stty -a) :input "/dev/tty"))
    1)))

(define (ruler n)
  (map (lambda (n s) (if (= (modulo n 10) 0) "+" s))
       (iota n 1)
       (take (circular-list "-") n)))

(print (apply string-append (ruler (column))))