Oh! Can Not Diary

おきゃんなダイアリー

腐女子のためのlisp入門 #1

lispの第一回です。いきなりですが、関数定義についての話をします。

関数定義の方法

elispの関数定義の方法は以下のようになっています。

(defun 関数名 (仮引数1 仮引数2 ...)
フォーム)

かけざん関数をつくる

というわけで、早速、みなさんにはおなじみのあのかけざんをする関数をつくっちゃいましょう☆★☆★☆

(defun × (seme uke)
  (message "%s × %s" seme uke))

(× 'kusakabe 'sajo)  ; "kusakabe × sajo"と表示される

簡単ですね。

上のコードはEmacsのscratchバッファに書いてすぐに試すことができるので、好きなだけかけざんしましょう。

括弧について

最初は括弧が多くて戸惑うかもしれません。でも慣れればかわいく見えてくるので大丈夫です。
それでも信じられないという方は、開き括弧"("を攻め、閉じ括弧")"を受けだと思って、もう一度上のコードを見てください。

どうですか???括弧が愛おしく感じてきませんか???
そしていつの間にか")"が健気な美少年に見えてくるはずです。
多くの障壁を抱えつつも強くひきつけあう二人の愛に感動し涙するかもしれません。
# けれど、障害のない愛()は空っぽ(nil)と評価されてしまうのだから皮肉ですよね。

ついてこられたあなたはもう元には戻れません。おとなしくlisperの道をすすみましょう。


最後は私の妄想が暴走してしまう感じになってしまいました。ごめんなさい。
次回もこんな感じで書きたいこと書くつもりです。では第二回をお楽しみに。

おわり

腐女子のためのlisp入門 #0

はじめに

ネットにlispの入門記事はたくさんあるのですが、腐女子のために書かれた記事はまだなかったので思いつきで始めてみました。lisp入門と書きましたが、EmacsLispを扱うことにします。Schemeでも書くかもしれません。まぁネタなので適当です。

腐女子lispを勉強するべきたった一つの理由

id:shim0mura氏のblogの2011年テキストエディタ界の動向まとめと、来年次のvimエディタ普及に向けた対策資料という記事に衝撃的な記述がありました。

emacsユーザーは今、ホモに興味がある。

まぁ、そういうことです。
それなら腐女子のためのEmacs入門にしろよとかは言わない約束です。

elispでカップリングするcoupling.el

この記事はEmacs Advent Calendar jp: 2011 の 18 日目です。17 日目は、@masutakaさんの私の.emacsからピックアップした設定3つ #EmacsAdventJP [Emacs]でした。

こんばんは。Emacs(腐)女子のおきゃんです。今年も皆さんが役立つTipsをあげてくださっている中、こんなネタ記事しか書けず大変申し訳ない気分でいっぱいですがどうか箸休め的な感じで見ていってください。

coupling.elについて

ということで、coupling.elの紹介です。
coupling.elは、指定したディレクトリの拡張子を取り除いたファイル名のリストから、ランダムにカップリングを生成してミニバッファーに表示するelispです。
意外な組み合わせが、アイディアを生み出すヒントになるかもしれません!
# タイトルはelispで〜とありますが、デフォルトをelispのディレクトリにしているだけでどこでもありです。

インストール

使う人がいるとは思えませんが、インストール方法です。
https://gist.github.com/1493361からダウンロードし、ロードパスの通ったところに置いて、init.elなり.emacsなりに以下のように記述します。
coupling-source-directoryは適当に好きなディレクトリ名を設定してください。デフォルトは"~/.emacs.d/elisp"になっています。

;; coupling
(require 'coupling)
(setq coupling-source-directory "~/.emacs.d/elisp/test") ; 任意のディレクトリ
(global-set-key (kbd "C-c b") 'coupling-from-directory)
;; key-chordインストール済みの場合
(key-chord-define-global "bl" 'coupling-from-directory)

これで、key-chordを使っている人なら、blと打つだけで次々とミニバッファーにカップリングが生成される!!!素敵!!!!!

f:id:oh_cannot_angel:20111218041325p:plain

経緯と今後の方針

elispで掛け算するのが趣味なので、自動的に生成できたら面白いかなと思って作りました。なので、ファイル名でカップリングするというちょっと気持ち悪いことをしています。が、気が向いたら、ディレクトリを複数指定できるようにしたりとか、マンガやアニメキャラのリストを用意してそこから選べるようにしたりとかできたら楽しいかなとか考えています。



明日は@myuheさんの sheephead: Stay hungry Stay foolishです。では引き続きEmacs Advent Calendar:2011をお楽しみください。

reverse

テスト。

(define A "abcde")
(define B "1234")

(define rev-list
  (lambda (list new-list)
    (cond
     ((null? list) new-list)
     (else (rev-list (cdr list) (cons (car list) new-list))))))

(define rev
  (lambda (str)
    (cond
     ((null? str) null)
     (else (list->string (rev-list (string->list str) '()))))))

(rev (string-append (rev A) (rev B))) ;1234abcde

reverse

例の30minプログラミングから。

問題1

文字列 A と B があり、C を A+B とする。文字列を逆順にする関数 rev() をつかって、
rev(rev(A) + rev(B)) という操作をすると結果はどうなるか。
まず予想したあと、実際にプログラムを書いて確かめよ。
例: A="abcde"、B="1234"、C="abcde1234"

予想はC="1234abcde"
Schemeで書きました。

(define A "abcde")
(define B "1234")

(define rev-list
  (lambda (list new-list)
    (cond
     ((null? list) new-list)
     (else (rev-list (cdr list) (cons (car list) new-list))))))

(define rev
  (lambda (str)
    (cond
     ((null? str) null)
     (else (list->string (rev-list (string->list str) '()))))))

(rev (string-append (rev A) (rev B))) ;1234abcde

# ハイライトされてないけど…

実行結果
http://ideone.com/oXJPh
# ideoneだとwriteしないとoutputに出なかったのでちょっと変えています。

rev()を使ってswapができますよという話でした。でも再帰向いてないですよね。
あとこの時の勉強会で、何割のプログラマが再帰を使ったプログラムが書けるかという話になり、9割、3割、1割、1%という意見が出ました。さあどれくらいいるでしょう。

30minプログラミングのこと

私はいま客先常駐の身なのですが、常駐組の同僚数名で週一回、昼休みにスマホ勉強会というのを開催しています。雑談で終わる時もあるゆるい感じですが、私が常駐始めた時には既に始まっていたので、なんだかんだで2年以上続いていることになります。そもそもAndroid勉強会という名前だったのが、私がiPhoneにしたこともあってスマホ勉強会になったといういきさつがあります。が、いまやスマホも関係なくなっています。ちょっと前まではカードゲームとかやっていました。(フランスのDixitとか。これはこれで面白かった。)で、最近はというと、オフラインという環境を生かしてネットレスコーディング修行というのをやっています。制限時間30分、言語自由、調べていいのは言語仕様のみというルールでその日の用意された課題から選んでプログラムを書いています。実際は、昼ごはん食べ終わってからとりかかると10分ぐらいしかありませんが…。私はいつもSchemeで挑戦してますが、上司が苦笑いしているのでそろそろPythonとかにしたほうがいいかなと思っています!!!しかし、2年前とはAndroidをとりまく環境も変わりましたし(HT-03Aが出たばかりでした)、勉強会の情報共有の手段もGoogle WaveからGoogle+に移行しましたし、時間の流れをしみじみと感じる今日この頃ですね。