スケジュール帳のカバーを作りました

手帳カバー

これも1週間くらい前に作ったものです。
今スケジュール帳はほぼ日を使っているのですが、やっぱり普段持ち歩くのには大きいなぁと思っています。ダイゴーの見開き1週間のやつに乗り換えようか検討中。
しかしこのカバーはペンホルダーが大き過ぎていまいちです。近い内に作り直したいと思います。

関数型言語Ruby (2)

id:ha-tan:20070618:1182168283の続きです。パターンマッチが入り始めました。

module FunctionalRuby
  FUNCS = {}

  X = Object.new

  class Function
    def initialize(sym)
      @sym = sym
      @func = []
    end

    def add(pat, &f)
      @func.push([pat, f])
    end

    def [](*xs)
      @func.each do |func|
        pat, f = *func
        return f[*xs] if match_pattern?(pat, xs)
      end
      raise(ArgumentError, "no match pattern. #{@sym}") unless f
    end

    private

    def match_pattern?(pat, xs)
      return true unless pat 
      return false unless pat.size == xs.size
      pat.zip(xs) do |pat, x|
        next if pat == X
        next if pat === x
        return false
      end
      true
    end
  end

  def define(sym, pat = nil, &f)
    FUNCS[sym] ||= Function.new(sym)
    FUNCS[sym].add(pat, &f)
    self.class.module_eval("def #{sym}; fun(:#{sym}); end")
  end

  def curry(f, *vs)
    lambda {|v| f[vs + [v]] }
  end

  def fun(sym)
    FUNCS[sym]
  end
end

mapはこうなりました。

define(:map, [X, []]) do
  []
end
define(:map) do |f, xs|
  x, *xs2 = *xs
  [f[x]] + map[f, xs2]
end