Schemeでネット対応のアプリケーション(というか小さなツール)はどうやって作るのだろう、と思っていましたが、そういった部分は各Scheme実装が独自に機能拡張をしているようです。たとえばypsilonにはソケット・ライブラリが付属しており、リファレンス・マニュアルには以下のようなサンプルが書いてありました。
(import (rnrs) (ypsilon socket)) (call-with-socket (make-client-socket "www.w3.org" "http") (lambda (socket) (call-with-port (transcoded-port (socket-port socket) (make-transcoder (utf-8-codec) (eol-style none))) (lambda (port) (put-string port "GET / HTTP/1.1\r\n") (put-string port "HOST: www.w3.org\r\n") (put-string port "\r\n") (shutdown-output-port port) (display (get-string-all port))))))
これでindex.htmlを持ってこれます。意外に簡単。Gaucheでも同様に
(use gauche.net) ;; Returns three values: host, port, and path. (define (parse-url url) (rxmatch-let (rxmatch #/^http:\/\/([-A-Za-z\d.]+)(:(\d+))?(\/.*)?/ url) (#f host #f port path) (values host port path))) (define (get url) (receive (host port path) (parse-url url) (call-with-client-socket (make-client-socket 'inet host (string->number (or port "80"))) (lambda (in out) (format out "GET ~a HTTP/1.0\r\n" path) (format out "host: ~a\r\n\r\n" host) (flush out) (copy-port in (current-output-port))))))
というものが載っていました。こっちはURLの処理なども含めてありますが、どちらにせよそんなに行数を書かなくてもよいのですね。中で行われていることについても、RubyやPythonで見たことのある処理と同様で、理解しやすかったです。Schemeは「実用的でない教育向け言語」と思っていましたが、意外に何でもできてしまうのでは?