2009-06-24
■ [vim] VimでESCを押すたびにファイルを保存する
.vimrcに
inoremap <ESC> <ESC>:<C-u>w<Return>
と書いておくと、ESCでインサートモードから抜けるたびに「:w」でファイルを保存するようになる。
やりすぎだ、と言われるかも知れないが、svnやgit等のバージョン管理システムを使っていれば特に 問題になることはない。むしろ、いちいち「:w<Return>」などと3つもキーを叩いてファイルを保存するのが無駄に思えるくらいだ。
(6/26追記:一方Vimハッカーはこうした:)
■ [ruby] オブジェクト?それクロージャでできるよ
という話はLisp系の人ならご存じかもしれないが、最近Schemeでやってみたらなかなか心地よかったので Rubyでも書いてみる。
まず
class Fruits
def initialize(name)
@name = name
end
attr_accessor :name
def squeeze
"#{@name} juice"
end
def squeeze_with(other)
"Mixed juice (#{@name} and #{other.name})"
end
end
というクラスを考える。使い方は、
orange = Fruits.new("Orange")
orange.name #=> "Orange"
orange.name = "Tangerine"
orange.squeeze #=> "Tangerine juice"
mango = Fruits.new("Mango")
orange.squeeze_with(mango) #=> "Mixed juice (Orange and Mango)"
という具合だ。
これをクロージャで表現するとこうなる。
Fruits = lambda{|name|
lambda{|method|
case method
when :name
name
when :name=
name = args[0]
when :squeeze
lambda{ "#{name} juice" }
when :squeeze_with
lambda{|other| "Mixed juice (#{name} and #{other.name})"}
else
raise ArgumentError("unknown method: #{method}")
end
}
}
# オブジェクト生成
orange = Fruits["Orange"]
# プロパティの操作
orange[:name] #=> "Orange"
orange[:name=, "Tangerine"]
# メソッド呼び出し(引数なし)
orange[:squeeze][] #=> "Tangerine juice"
# メソッド呼び出し(引数あり)
mango = Fruits["Mango"]
orange[:squeeze_with][mango] #=> "Mixed juice (Orange and Mango)"
見たまえ、関数がオブジェクトのようだ!*1
ここではコンストラクタもオブジェクト自身も関数で表される。Rubyのオブジェクト指向と違い、ここではプロパティとメソッドを分けてみた。 オブジェクト関数にメソッド名を与えて呼び出すと、メソッド関数が返ってくる。だからメソッド呼び出しはいつも関数を2回呼ぶことになる。 なんで処理を直接書かずに関数呼び出しを経由するかっつーと、引数の扱いを簡単にするためだな。というのが書いてみて分かった。
*1 いやRubyだと実際Procオブジェクトなんだけどw
SICPの最初の方にそんな話が.