Hatena::ブログ(Diary)

ネットブックは開発マシンの夢を見るか

2011-04-02

lisp 再帰ドリル

| 00:31

dolist もいいけど、もうちょっと lispっぽく行きたい。

そういうことなら、まずは再帰だ。そもそも体が再帰を考えることに慣れてないと自覚したので、ココを見て練習してみる。

1. まずは恒例の n! を求めるやつ。n! = 1 * 2 * 3 * ... n 。

(defun my-fact (n)
  (if (= n 0)
      1
    (* n (my-fact (1- n)))))

;; test
(my-fact 3)
6

よし、つぎ。

2. m の n 乗を出す。m の n 乗 = m * m * m * ... m (m は n個)。

(defun my-expt (m n)
  (if (= n 0) 1
    (* m (my-expt m (1- n)))))

;; test
(my-expt 2 10)
1024

OK。どんどん行こう。

3. リストの要素数を求める。

(defun my-length (lst)
  (if (eq lst '())
      0
    (1+ (my-length (cdr lst)))))

;; test
(my-length '(a b (x y z) c d))
5

ノッてきた。

4. 数値リストの要素の合計を求めるやつ。

(defun my-sum-list (lst)
  (if (eq lst '())
      0
    (+ (car lst) (my-sum-list (cdr lst)))))

;; test
(my-sum-list '(1 2 3 4 5 6 7 8 9 10))
55

よしよし。これくらいなら行けるぞ。

5. リストから指定した要素を除いたリストを返すにはどうする?

(defun my-remove (lst e)
  (if (eq lst '())
      '()
    (if (eq e (car lst))
        (my-remove (cdr lst) e)
      (cons (car lst) (my-remove (cdr lst) e)))))

;; test
(my-remove '(a x b c x x d x e f) 'x)
(a b c d e f)

・・・ちょっと苦しかったな。気を取り直して、つぎ。

6. リストの指定した要素の位置を返すやつ。 (位置はゼロ始まり)

(defun my-epos (lst e)
  (if (eq lst '())
      '()
    (if (eq (car lst) e)
        (append (my-epos (cdr lst) e) (list (1+ (length lst))))
      (my-epos (cdr lst) e))))

;; test
(my-epos '(a b x c d x x e f x) 'x)
(2 5 6 9)

なんとかいけたけど結構 try and error を繰り返した。


まぁ、やるまえよりは再帰が身についたと思う。

今の自分にできるアプローチとしては、最初のやつ

(defun my-fact (n)
  (if (= n 0) 1
    (* n (my-fact (1- n)))))

を基本パターンとして書いてみて、それをちょこっと変更することを考えてみるって感じだろうか。

そんなのしなくても、慣れればズババーと書けるんだろうけど、いっぺんにそこまで到達するのは無理っぽい。

「これは再帰でいけるかな?」と考える癖だけでもつけておくことにしよう。

Android + Clojure > mini 9 + xyzzy ?

| 17:10

minimum で self な lisp 環境を Android でできないかと妄想してみる。

こんな条件ではどうかと。

  1. REPL が使える
  2. Emacs が走る
  3. lisp で書いた、その機械のアプリをセルフでビルドできる

1 は Clojure で、こんなのを見つけた。

2 これはすごいな。機種限定でさらにハックが前提みたいだけど、Emacs から電話したり SMS 飛ばしたりできてるみたい。

3 クロス環境な こんなのはよく見かけるけど、セルフ環境は発見できなかった。探し方が甘いかな。


非常に惜しい。使用感にもよるけど 3 さえ叶えばネットブックから乗り換えてもいいのにな。

でもま 1, 2 だけでも相当遊べそう。

とくに 2 はセルフなビルド環境とかなくても elisp だけでいいのかもしれないとか思わせてくれる。

じゃあ、ためしに softbankキーボードつきのスマフォを物色してみよう・・・

GALAPAGOS 005SH

・・・キーボードつきって↑これだけ?まじ? 選択肢なし?

3D は全くいらんし、クロムメッキの縁取りは恥ずかしい。

ドコモなら LG のがあるけど、似たり寄ったり。

というわけで、まだスマフォは早いかなという結論にしとく。

ThinkPad 並みのマットな筐体のやつが出てきたらそのとき考えよう(結局外見か!)。

しかし、スマフォなんて、

PI-3000時代のザウルスに毛が生えたようなもんだ。」

くらいにしか思ってなかったんだが、どうやらそうでもないらしい。

xyzzy の C-k (kill-line)

| 14:53

職場の xyzzy は入れてからずいぶん経つので、自分にはかなり枯れてきている。

対して家のは全然そこまで行ってなくて、同じ感覚で使っていると「ムムム」と思うことがよくある。

まぁ、家の xyzzylisp 練習器 なので lisp-mode が適当に動いてくれれば問題ないんだが、これはさすがにどうか。

xyzzyデフォルトでは C-k しても kill-ring に入ってくれないのか。

ある1行を移動させるときは、行頭で C-k して、別の場所で yank するということを頻繁にやる。

職場のはたぶん適当になにか書いて済ませたと思う。家でもう一度それを書くのもダルい。

誰か書いてないかな?・・・あった。

http://d.hatena.ne.jp/negation/20090218/1234908800

kill-ring に入ってくれるだけでよかったが、Windowsクリップボードと同期してくれるそうで、これは助かる。

ありがたく拝借させていただく。