文字列を指定されたバイト数で分割

良い問題がないかなあと探していたら「どう書く?org」を思い出したのでやってみる。
問題は234

与えられた文字列を指定されたバイト数以下に分割する関数
splitBytes を書いてください。エンコーディングは実装側の
自由としますが、日本語対応は必須とします。
また、分割した結果の表現方法は、各言語で都合のよいものを
選択して下さい。(リスト,配列,改行区切りなど)

[使用例]
"あいうえおabcdeかきくけこfghij" -> 30バイト (Shift_JIS)
"あいうえおabcdeかきくけこfghij" -> 40バイト (UTF-8)

★Shift_JISで10バイトで分割
splitBytes("あいうえおabcdeかきくけこfghij", 10, "Shift_JIS")
=> ["あいうえお", "abcdeかき", "くけこfghi", "j"]
    (10バイト, 9バイト, 10バイト, 1バイト)

★UTF-8で10バイトで分割
splitBytes("あいうえおabcdeかきくけこfghij", 10, "UTF-8")
=> ["あいう", "えおabcd", "eかきく", "けこfghi", "j"]
    (9バイト, 10バイト, 10バイト, 1バイト)


間数名がSchemeらしくないので変えているけど完成。

#!/usr/bin/gosh

(define (string-split-byte byte . str)
	(let loop ((s (caar str)) (init ""))
		(let* ((s1 (make-string 1 (string-ref s 0)))
					(next (substring s 1 (string-length s)))
					(s2 (string-append init s1)))
		(cond [(= (string-size s) 0) init]
			[(= (string-size next) 0) s2]
			[(>= (+ (string-size init) 1) byte) (cons s2 (loop next ""))]
			[else (loop next s2)]
			))))

(define (main args)
	(print (string-split-byte 10 (cdr args)))
	0)

追記:ちょいと修正 s2の追加。


日本語もOK。
match使った方が良いかな?