SchemeでHTTPアクセスの第一歩

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の処理なども含めてありますが、どちらにせよそんなに行数を書かなくてもよいのですね。中で行われていることについても、RubyPythonで見たことのある処理と同様で、理解しやすかったです。Schemeは「実用的でない教育向け言語」と思っていましたが、意外に何でもできてしまうのでは?