トップ «前の日記(2009-06-23) 最新 次の日記(2009-06-25)» 編集

Route 477



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

本日のツッコミ(全1件) [ツッコミを入れる]
ささだ (2009-06-25 09:23)

SICPの最初の方にそんな話が.