たなっちのメモ

ロボットとWebサービスを触ってたハッカソン好きの地方工業大学生。最近は機械学習とコンパイラ、OS開発をこっそり勉強中。時間と余裕とモチベがあったら書く予定(?)。

Scheme に手を出してみた

研究に1ミリも関係ない
Scheme の勉強をしています.


今年度の初めに研究室配属がありました.
そうか,もう研究室に配属される歳かと思いながら.

僕は希望通りの研究室に入れました.
うちの学科では珍しい,ロボットソフトウェア系です.
(うちの学科の研究室が多種多様すぎてむしろ普通かもしれない.)

ハッカソンの相棒は Lisp 好きの先生の研究室に配属されました.

飲み会のときにその先生と n 次会までいって
なんやかんやあって,この先生の研究室にも片足突っ込むことになりました.

次の週,ゼミに乗り込んだら
「誰やお前!?」って感じの反応されましたが…
(言われてはいない)

そこのゼミでは「Scheme 手習い」という本に沿って
学習をすすめるということをしていました.

Scheme手習い

Scheme手習い

自分も早速,学校で借りて読んでいきました.
率直な感想としては,
ページ数と覚えることが少ない割に
奥がとんでもなく深い…
といった感じでした.

あと,表紙が地味に再帰してるのがイカしてました.

研究室の課題というか, Scheme の練習サイトが研究室にあって
いつのまにか私のアカウントまで用意されてました...

  • L-99 の解答を投稿するサイト
  • 「Collatz 数列が最長となる数を求めよ」などの問題を解き,実行速度を競うサイト

かなり難易度が高いものもありますが,非常に面白いです.
ちなみに下の方のサイトは僕の相棒が開発・運営しているそうです.流石.

さっそくやってみることにしました.
私はプログラムを書く経験がある程度ある方だと思っていましたが,
L-99 の序盤(9問目)で詰まってしまいました.

P09 (**) Pack consecutive duplicates of list elements into sublists.
If a list contains repeated elements they should be placed in separate sublists.

Example:
* (pack '(a a a a b c c a a d e e e e))
'((a a a a) (b) (c c) (a a) (d) (e e e e) )

要は,「連続する要素(atom)をまとめたリスト」のリストを作る
"pack" 関数を作れとのことです.

これを再帰で書くってどうやるんだ?と
しばらくイメージできませんでしたが
最近になって解決できました.

(define (pack lst)
  (define (pack-aux lst buff result)
    (cond
      ((null? lst) 
       result)
      ((null? buff) 
       (pack-aux (cdr lst) (list (car lst)) result))
      ((eq? (car lst) (car buff)) 
       (pack-aux (cdr lst) (cons (car lst) buff) result))
      (else 
       (pack-aux (cdr lst) (list (car lst)) (cons buff result)))))
  (reverse (pack-aux lst '() '())))


(display (pack '(0 0 0 1 1 2 2 2 2 2 3 3 4 5 5)))
; => ((0 0 0) (1 1) (2 2 2 2 2) (3 3) (4))

これまで再帰で解決することってなかなかなくって, 慣れるのに時間がかかりましたね.

処理結果をストックする変数を2つ使うという発想はなかなか出てこなかった…
(1つでもできなくはないが頭に優しくなさそう.)
あとなんかシンタックスハイライトがついてくれない.
ついたわ

Scheme を触ってみて,直感的な感触としては

  • 文法が非常に単純である
  • 生のロジックを組んでる感じがする(コードそのものがS式になってる的な意味)
  • CやC++にあるような、内部の暗黙的な挙動・クセが少ない(という印象)

という点が魅力的だと思いました.うん.

この先生はコーディングにおける哲学的な知識を多くお持ちで,
話を聞いていても,先生のコードを見ていても
多くの学びが得られますね.
(ちと過激ですが…)

まあ,本命の方の研究室の課題とかに
支障が出ない程度に頑張りたいと思います.

また面白いものが書けたら Up するつもりです.

Visit my Home page.