2008年 07月 12日

Re: ゆの in Ruby

「おまえのコードつまんねーんだよ!!11」ってゆわれた気がしたのでバリエーションつくってみました><

# *_missing
class Object
	def self.const_missing(n)n end
	def method_missing(n, *a)
		print (n == :<) ? a : ({
			[:_, $!] => "ひだまり",
			[:/, :_] => "スケッチ",
			[:/, :X] => "×365"
		}[[n, a[0]]] || " ")
		n
	end
end


X / _ / X < 来週も見てくださいね!
# 上のと同じのをちょっとゴルフぽく。(むずい)
class X;end
class Object
def method_missing(n,*a)print n==:<?a:({[:_,$!]=>:ひだまり,[:/,:_]=>:スケッチ,[:/,X]=>:×365}[[n,a[0]]]||" ");n end
end

X / _ / X < 来週も見てくださいね!
# ひたすらエラーハンドリング

begin

X / _ / X < 来週も見てくださいね!

rescue NoMethodError => e
	case e.message[/`(.+)'/, 1]
	when "/"
		print "×"
		Object.__send__(:define_method, :/) {|
			x| _ |x
		}
		Object.__send__(:public, :/)
		retry
	when "|"
		print "365 "
		Regexp.__send__(:define_method, :|) {
			(/ _ /x)
		}
		retry
	else
		puts Regexp.last_match[1]
	end
rescue NameError => e
	case e.message
	when /constant X/
		Kernel.const_set(:X, :X)
		print "ひだまり"
		retry
	when /variable or method `_'/
		Kernel.__send__(:define_method, :_) { (/ _ /x) }
		print "スケッチ"
		retry
	end
end

とてもねむい

ゆの in Lua

なんかまだないっぽい

X = setmetatable({ x = "" }, {
	__div = function (o1, o2)
		if o2 then
			X.x = X.x .. "スケッチ"
		else
			X.x = X.x .. "ひだまり"
		end
		return o1
	end,

	__lt  = function (o1, o2)
		print(X.x)
		return X
	end,

	__call = function (self, arg)
		X.x = X.x .. "×365 " .. arg
		return X
	end,
})


return
X / _ / X < X"来週も見てくださいね!"
  • 普通に演算子オーバーロード
  • return つけないと式とみなされなくて syntax error
  • print は改行が入ってしまうので最後に一度だけ
  • 連結演算子が .. であることをすっかり忘れていてハマった
  • 比較演算子はオペランドが両方とも同じ型でないとエラーになってしまうため、ラップしてる
  • X"foo" は X("foo") と同じ、でもって、関数呼びだしはメタテーブルの __call になる。
  • 宣言していない、一度も代入していない変数が普通に nil として使えてしまうので _ に定義はいらない