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の最初の方にそんな話が.