コマンドプロンプトで Gauche プログラミング

Scheme (LISP) プログラミングでは括弧の対応と自動インデントくらいは開発環境 (エディタ) のサポートがないと本当につらい。 Scheme 処理系のひとつである Gauche もまた、公式に以下ような文で Emacs から使うことが推奨されている。

gosh を Windows Console でインタラクティブに使うのは何かと苦痛が多いので、 Emacs から gosh を使うことを強く推奨します。

http://practical-scheme.net/gauche/download-j.html

しかし、最も標準的に使われている Emacs は初心者には高いハードルである。 ちょっとした確認くらいはコンソール上でやりたいというのもよくわかるのだが、コマンドプロンプト (Windows Console) 上では日本語が化けてしまう場合があるという問題も指摘されている。

http://d.hatena.ne.jp/foussin/20140413/1397343169

Gauche にはポートをカスタマイズする方法やコンソールを制御する方法が用意されているので、これらを組み合わせて解決を図ってみた。

;; repl.scm

(use gauche.charconv)
(use gauche.vport)
(use gauche.uvector)
(use os.windows)

(define (puts-console str)
  (sys-write-console (sys-get-std-handle STD_OUTPUT_HANDLE) str))

(define (putc-console chr)
  (sys-write-console (sys-get-std-handle STD_OUTPUT_HANDLE) (string chr)))

(define (make-console-output-port)
  (make <virtual-output-port> :puts puts-console :putc putc-console))

(define (getc-console)
  (let1 buf (make-u8vector 2)
    (sys-read-console (sys-get-std-handle STD_INPUT_HANDLE) buf)
    (string-ref (ces-convert (u8vector->string buf) 'UTF-16LE) 0)))

(define (make-console-input-port)
  (make <virtual-input-port> :getc getc-console))

(with-input-from-port (make-console-input-port)
  (cut with-output-to-port (make-console-output-port) read-eval-print-loop))

使った感じはこんなの。

f:id:SaitoAtsushi:20140414103729p:plain

Document ID: 4c621385a67aa6bb5e4d1db5660fa0d9