Tech Racho エンジニアの「?」を「!」に。
  • ライフ

あどべんと。未経験大学生によるScheme入門日誌-第1話

まえがき

どうもこんにちは。シノラーの片山です。ともえもりょうこもどっちも好きです。くるくる、ミラクル〜↑↑

年末といえば忘年会、忘年会といえば酒ということで美味しかったお酒のレビューでもしようかと思ったんですが、評価が全て「スッキリしていて美味しい」になってしまったので断念しました。語彙力が貧弱です。

二日酔いの頭では何も思いつかなかったので、とりあえずSchemeをやってみることにしました。困ったときのハローワールドです。

本編

インストール

Gaucheなるものをインストールすれば動くらしいです。Macなら

$ brew install gauche

LISPといったらEmacsということで、Emacsにgaucheモードを導入します。.emacsとかに

(setq process-coding-system-alist
(cons '("gosh" utf-8 . utf-8) process-coding-system-alist))
(setq scheme-program-name "/usr/local/bin/gosh -i")

(autoload 'scheme-mode "cmuscheme" "Major mode for Scheme." t)
(autoload 'run-scheme "cmuscheme" "Run an inferior Scheme process." t)

(defun scheme-other-window ()
"Run Gauche on other window"
(interactive)
(split-window-horizontally (/ (frame-width) 2))
(let ((buf-name (buffer-name (current-buffer))))
(scheme-mode)
(switch-to-buffer-other-window
(get-buffer-create "*scheme*"))
(run-scheme scheme-program-name)
(switch-to-buffer-other-window
(get-buffer-create buf-name))))

(define-key global-map
"\C-cG" 'scheme-other-window)

を追加してあげます。

Emacsで.scmのファイルを開いてC-c Gをやってあげると別窓でGaucheが起動します。編集バッファのほうでカーソルを合わせてC-c C-eとかC-x C-eしてあげるとその場で実行されるので便利♪

ハローワールド

(print "Hello, World")

高速でC-x C-eしまくればハローワールドの達人になれます。

演算

ハローワールドはふっつーな感じでしたが、四則演算はどうでしょう。

(+ 1 2) ; 3
(- 1 2) ; -1
(* 1 2) ; 2
(/ 1 2) ; 1/2

Lispだなぁってなりますね。
面白いのは割り算の答えが分数になっていることでしょうか。

(exact->inexact (/ 1 2)) ; 0.5

exact->inexactという関数を使うと分数から浮動小数点型になおしてくれるみたいです。

余りを出すには%がよく使われますが、Schemeでは使えません。代わりに

(modulo 123 11) ; 2
(remainder 123 11) ; 2

とかを使ってあげると余りが出せます。他の細かい関数は面倒なので必要になったら調べることにします。

変数と関数

変数を作ってみます。

(define hensu1 100)
(define hensu2 200)
(+ hensu1 hensu2) ; 300

defineのあとに引数として、変数名、値をいれてあげます。
なんとなくわかったので次は関数です。

(define kansu
  (lambda (hensu)
    (+ hensu 1)))

細かいことはわかりませんが、(define 関数名 (lambda 仮引数 手続き))みたいなイメージでしょうか。
この場合実行するときには

(kansu 4) ; 5

(関数名 引数)って感じです。

ちなみに、lambdaを省略した記述方法もあるみたいです。

(define (kansu hensu)
  (+ hensu 1))

一行短くなりました。

ハローワールドとボディマス計算をするくらいしか持ちネタが無いので次はボディマス計算を作ってみます。
ボディマス計算は、身長(m)の二乗で体重(kg)を割る計算でした。

(define bmi
  (lambda (h w)
    (/ w (expt (/ h 100) 2))))

(bmi 178 58) ; 145000/7921
(exact->inexact (bmi 178 58)) ; 18.30576947355132

身長はセンチメートルで入力したものをメートルになおして計算する感じにしました。exptというのは累乗を計算してくれる組み込み関数らしいので使ってみました。

自分で書いてる時には気にならないんですけど、改めて見てみるとやっぱり括弧多くてゲンナリしますね。

ゲンナリついでに第一回はここらへんまでということにします。

結び

残留アセトアルデヒドの猛攻撃に耐えながら執筆したら変なテンションの文面になってしまいました。しばらくお酒は飲みたくないです。


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。