Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2006-10-14

勉強するよ.17

| 18:23 | 勉強するよ.17 - わだばLisperになる を含むブックマーク はてなブックマーク - 勉強するよ.17 - わだばLisperになる

Schemeの勉強.17

独習 Scheme 三週間 Teach Yourself Scheme in Fixnum Days

今日は、第16章シェルスクリプト

主にというか、UNIXのシェルスクリプトとして動かして

みようってわけらしい。

Gaucheの場合、スクリプトの内容にmainを定義すること

によって、そのmainを呼ぶことで実行する仕組があるよ

うで、詳細は、

Gauche ユーザリファレンス: 3.3 Schemeスクリプトを書くを参照。

ということで、

#!/usr/bin/env gosh

(define (main args)
  (begin 	
    (display "Hello, World!") 
    (newline)))
#!/usr/bin/env gosh

(define (main args) 
  (let ((argv-count (length args)))
    (let loop ((i 1))			;$1 ...
      (unless (>= i argv-count)
	      (display (list-ref args i))
	      (newline)
	      (loop (+ i 1))))))
#!/usr/bin/env gosh

;; floppy-size = 3.5インチフロッピィにおさまるバイト数
(define floppy-size 1440000)

;; split は大きなファイル f をフロッピィの容量サイズの小さいサブファイルに
;; subfile-prefix.1、subfile-prefix.2 などに分割する。
(define split
  (lambda (f subfile-prefix)
    (call-with-input-file f
      (lambda (i)
        (let loop ((n 1))
          (if (copy-to-floppy-sized-subfile i subfile-prefix n)
              (loop (+ n 1))))))))

;; copy-to-floppy-sized-subfile は次の 1.44M Byte (のこりがこれよりも
;; 少ければ、全部)をその大きいファイルから n 番目のサブファイルに
;; コピーする。まだ、残っていれば真を返し、さもなければ、偽を返す。
(define copy-to-floppy-sized-subfile
  (lambda (i subfile-prefix n)
    (let ((nth-subfile (string-append subfile-prefix "."
                                      (number->string n))))
      (if (file-exists? nth-subfile) (sys-remove nth-subfile))
      (call-with-output-file nth-subfile
        (lambda (o)
          (let loop ((k 1))
            (let ((c (read-char i)))
              (cond ((eof-object? c) #f)
                    (else
                     (write-char c o)
                     (if (< k floppy-size)
                         (loop (+ k 1))
                         #t))))))))))

(define (main args)
  ;; bigfile = スクリプトの第一引数= 分割する必要のあるファイル
  ;; subfile-prefix = スクリプトの第二引数 = サブファイルのベース名
  (let ((bigfile (list-ref args 1))	
	(subfile-prefix (list-ref args 2)))
    ;; split を呼び、subfile-prefix.{1,2,3,...} を bigfile から生成する。
    (split bigfile subfile-prefix)))

と書き直してみる。

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20061014