Mgr (Diskussion | Beiträge) (Yeah! Lecker Extended-Loop-Macro! Und die einzelnen Flo-Variablen werden zur Kompilierzeit erstellt!) |
(Mehr rubyfoo!) |
||
Zeile 28: | Zeile 28: | ||
(format t "~&flo~d = ~a" i (eval (read-from-string (format nil "*flo~d*" i))))) | (format t "~&flo~d = ~a" i (eval (read-from-string (format nil "*flo~d*" i))))) | ||
</pre> | </pre> | ||
Und nun nochmal Ruby mit viel bloatigem Metaprogramming-Foo | |||
<pre> | |||
#!/usr/bin/env ruby | |||
class Flo | |||
def self.metaclass; class << self; self; end; end | |||
def self.traits(*arr) | |||
return @traits if arr.empty? | |||
attr_accessor *arr | |||
arr.each do |a| | |||
metaclass.instance_eval do | |||
define_method( a ) do |val| | |||
@traits ||= {} | |||
@traits[a] = val | |||
end | |||
end | |||
end | |||
class_eval do | |||
define_method( :initialize ) do | |||
self.class.traits.each do |k,v| | |||
instance_variable_set("@#{k}", v) | |||
end | |||
end | |||
end | |||
end | |||
traits :name, :skill, :notebook | |||
def to_s | |||
s = "#{self.class} is actually #{self.name} and is good at #{self.skill}\n\tHe loves hacking on his #{self.notebook}" | |||
end | |||
end | |||
class Flo0 < Flo | |||
name "dividuum" | |||
skill "DOOM" | |||
notebook "old Dell" | |||
end | |||
class Flo1 < Flo | |||
name "Peter" | |||
skill "math" | |||
notebook "IBM Thinkpad" | |||
end | |||
class Flo2 < Flo | |||
name "Fiji" | |||
skill "WOW" | |||
notebook "i have no idea" | |||
end | |||
class Flo3 < Flo | |||
name "flowhase" | |||
skill "hoppeln" | |||
notebook "hasIbook" | |||
end | |||
a = [ Flo0.new, Flo1.new, Flo2.new, Flo3.new ] | |||
a.each { |f| puts f } | |||
</pre> | |||
[[Kategorie:Wissen]] | [[Kategorie:Wissen]] | ||
[[Kategorie:Entropia]] | [[Kategorie:Entropia]] |
Version vom 3. November 2005, 12:11 Uhr
#!/usr/bin/env ruby flo = [ "dividuum", "syb", "fiji", "flowhase" ] # flos sind keine arrayss1! for i in 0..3 eval "flo#{i} = flo[#{i}]" puts "flo#{i} == \"" + eval("flo#{i}") + "\"" end
Dieses Perl (*duck*) kann ja keiner lesen!
(eval-when (:compile-toplevel :load-toplevel :execute) (defvar *flo-sequence* #("dividuum" "syb" "fiji" "flowhase"))) (defmacro make-individual-flo-variables () (cons 'progn (loop for flo across *flo-sequence* for i from 0 collect `(defvar ,(read-from-string (format nil "*flo~d*" i)) ,flo)))) (make-individual-flo-variables) (dotimes (i 4) (format t "~&flo~d = ~a" i (eval (read-from-string (format nil "*flo~d*" i)))))
Und nun nochmal Ruby mit viel bloatigem Metaprogramming-Foo
#!/usr/bin/env ruby class Flo def self.metaclass; class << self; self; end; end def self.traits(*arr) return @traits if arr.empty? attr_accessor *arr arr.each do |a| metaclass.instance_eval do define_method( a ) do |val| @traits ||= {} @traits[a] = val end end end class_eval do define_method( :initialize ) do self.class.traits.each do |k,v| instance_variable_set("@#{k}", v) end end end end traits :name, :skill, :notebook def to_s s = "#{self.class} is actually #{self.name} and is good at #{self.skill}\n\tHe loves hacking on his #{self.notebook}" end end class Flo0 < Flo name "dividuum" skill "DOOM" notebook "old Dell" end class Flo1 < Flo name "Peter" skill "math" notebook "IBM Thinkpad" end class Flo2 < Flo name "Fiji" skill "WOW" notebook "i have no idea" end class Flo3 < Flo name "flowhase" skill "hoppeln" notebook "hasIbook" end a = [ Flo0.new, Flo1.new, Flo2.new, Flo3.new ] a.each { |f| puts f }