Yuki_S
September 10, 2009, 6:13pm
1
Feature #2080: Proc#to_source, Method#to_source
http://redmine.ruby-lang.org/issues/show/2080
e$B5/I<<Te(B: Yuki S.
e$B%9%F!<%?%9e(B: Open, e$BM%@hEYe (B: Normal
e$BC4Ev<Te(B: Koichi Sasada, e$B%+%F%4%je(B: core, Target version: 1.9.2
[ruby-core:24673]e$B$K8+$k$h$&$K!“e(BProc#to_sourcee$B$de(BMethod#to_sourcee$B$,$”$k$H!"e(B1.8e$B;~Be$Ke(Bnode.he$B$rMxMQ$7$F$7$^$C$F$$$?$h$&$J%i%$%V%i%j$NLdBj$NB?$/$r2r7h$G$-$^$9!#$=$3$Ge(Bnodee$B$de(Biseqe$B$K85$N%=!<%9%3!<%I$r;}$?$;$F$*$$$F!"I,MW$K1~$8$Fe(Biseqe$B$+$i<hF@$9$k$3$H$rDs0F$7$^$9!#e (B
e$B0lHLE*$K$O%3!<%I$O=hM}%G!<%?$KHf$Y$F==J,$K>.$5$$$N$G!"%a%b%j=jMWNL$NA}2C$O5vMFHO0O$G$O$J$$$G$7$g$&$+!#e (B
e$BNce(B:
proc = ->(x, y) {
x + y
}
proc.to_source #=> “x + y”
Yuki_S
September 10, 2009, 7:43pm
2
e$B!!$5$5$@$G$9!#e (B
Yuki S. wrote::
e$BC4Ev<Te(B: Koichi Sasada, e$B%+%F%4%je(B: core, Target version: 1.9.2
[ruby-core:24673]e$B$K8+$k$h$&$K!“e(BProc#to_sourcee$B$de(BMethod#to_sourcee$B$,$”$k$H!"e(B1.8e$B;~Be$Ke(Bnode.he$B$rMxMQ$7$F$7$^$C$F$$$?$h$&$J%i%$%V%i%j$NLdBj$NB?$/$r2r7h$G$-$^$9!#$=$3$Ge(Bnodee$B$de(Biseqe$B$K85$N%=!<%9%3!<%I$r;}$?$;$F$*$$$F!"I,MW$K1~$8$Fe(Biseqe$B$+$i<hF@$9$k$3$H$rDs0F$7$^$9!#e (B
e$B0lHLE*$K$O%3!<%I$O=hM}%G!<%?$KHf$Y$F==J,$K>.$5$$$N$G!"%a%b%j=jMWNL$NA}2C$O5vMFHO0O$G$O$J$$$G$7$g$&$+!#e (B
e$B!!;d$bJXMx$@$H;W$&$s$G$9$,!"$A$g$C$HJXMx$9$.$@$7!";EMM$N8!F$$b!"@($/<+M3e(B
e$BEY$N$"$k$o$j$K5DO@$,==J,$G$O$J$$$N$Ge(B 1.9.3
e$B$rL;X$7$F5DO@$9$k$H$$$$$H;We(B
e$B$&$s$G$9$,!"$I$&$G$7$g$&$+!J$D$^$j!"e(B2e$B%v7n$G<}B+$9$k$H$O;W$($^$;$s!K!#e (B
e$B!!JXMx$=$&$@$+$i!"$_$s$J4n$s$G;H$&$H;W$&$s$G$9$,!"4n$s$G;H$&$H;W$&$N$G!“e(B
e$B$d$C$Q$j;EMMJQ99!”$C$F$$$C$?$H$-%.%c$C$H$$$&?M$OB?$$$s$G$O$J$$$+$H;W$$$^$9!#e (B
e$B!!Nc$($P!“J,$+$i$J$$E@$H$7$F!”$Q$C$H<!$N$h$&$JE@$,;W$$$D$-$^$7$?!#;W$$$De(B
e$B$$$?=g$K=q$$$F$k$N$G!";EMM$H<BAu$NOC$,:.$8$C$F$$$^$9!#e (B
e$B0z?t$O!)e(B
1.1 e$B%*%W%7%g%J%k0z?t$O!)e(B
C e$B$G=q$$$?%a%=%C%I$O!)e(B
ISeq#to_source e$B$8$c$J$$$N!)e(B
3.1 ISeq e$B$Oe(B CRuby e$B8GM-$8$c$J$$!)e(B
e$BA4$F$N%a%=%C%I$NJ8;zNsI=8=$r$H$C$F$$/$N$O0U30$HBg$-$$$N$G$O$J$$$+!)e(B
e$B$?$H$($P!“e(BRails
e$B$@$H?t==e(BMBe$B$b$N%a%b%j$r$=$l$G>CHq$7$J$$$+!)e(B
4.1 e$B05=L$9$k!)e(B
4.2 e$B%U%!%$%kL>!”%]%8%7%g%s$@$1J]B8$7$F!"%U%!%$%k$+$iFI$_9~$`!)e(B
4.2.1 e$B%U%!%$%k$NJQ99$,$"$C$?$i$I$&$9$k!)e(B
4.2.2 eval e$B$@$C$?$i$I$&$9$k!)e(B
4.2.3 e$B<B$O!"e(Beval
e$BItJ,$@$1J]B8$7$F$ $$$F!"$"$H$O%U%!%$%k$+$i$Ge(B
e$B==J,$@$C$?$j$7$J$$!)!!%U%!%$%k$NF|IU$b0l=o$KJ]B8$7$F$*$$$F!“e(B
e$BF|IU$,0c$C$?$i%(%i!<e(B or nil
e$B$H$+!#$&!<$s!”;H$$$E$i$$$+$J!#e (B
4.3 e$BI,MW$J>l9g$O!“e(Btrace e$B$HF1MM$K2?$+e(B require
e$B$7$?$i!”$=$N8e:n@.$7$?e(B
iseq e$B$O%=!<%9$rJ]B8$9$k$h$&$K$9$k$H$+!)!!$G$b!“e(BRails
e$B$O$^$:;H$$e(B
e$B$=$&$@$+$i!”%a%b%j>CHqNL$K4X$9$k2r7h$K$O$J$i$J$$$J!#e (B
4.4 e$B3FJ8;zNs$re(B VALUE e$B$K$9$k$He(BGC pressure
e$B$,A}$($F7y$@$J$"e(B
-> e$BJLES4IM}!)e(B
4.5 temp file e$B:n$C$A$c$&!)!!e(BRuby
e$B5/F0$9$k$?$S$K?t==e(BMBe$B$N%G%#%9%/$r>CHq!“e(B
e$B7y$@$J$!!#e (B
5. e$B$I$3$^$GJV$9!)e(B
5.1 e$B%a%=%C%IFb%a%=%C%IDj5A$O!)e(B
5.2 e$B$H$$$&$+!“e(BProc e$BFb$N%/%i%9Dj5A!”%a%=%C%IDj5A!”%M%9%H$7$?e(B
Proc e$B$O!)e(B
6. e$B%3%s%Q%$%ie(B
6.1 e$B;vA0%3%s%Q%$%i$r:n$C$?$j:n$i$J$+$C$?$j$7$F$$$k$s$G$9$,!"e(B
e$B$=$N>l9g$I$&$J$k$N$+$J$!!#e (B
7. CRuby e$B0J30$O$I$&$J$s$@$m!#e (B
Yuki_S
September 13, 2009, 1:34pm
3
e$B%A%1%C%He(B #2080 e$B$,99?7$5$l$^$7$?!#e (B (by Etienne Vallette
d’Osia)
An other way would be to create a spec to represent ruby code into
s-expression.
Each interpreter transforms its internal representation into a standard
s-expression,
so ruby gains a cool and powerful lisp feature.
Maybe a simple lib/gem could provide this feature to some of the
existing interpretors (like ruby_parser for cruby 1.8).
It makes the file-pointing impossible (unless a temp file is created,
containing only s-expressions)
but if it is possible to transform iseq to sexpr, it will makes the
files-pointing useless.
Building source from sexpr is already done by some projects, so I
suppose it’s not a big deal.
http://redmine.ruby-lang.org/issues/show/2080
Yuki_S
September 14, 2009, 1:52pm
4
2009e$BG/e(B9e$B7ne(B11e$BF|e(B2:43 SASADA Koichi [email protected] :
e$B!!;d$bJXMx$@$H;W$&$s$G$9$,!“$A$g$C$HJXMx$9$.$@$7!”;EMM$N8!F$$b!“@($/<+M3e(B
e$BEY$N$”$k$o$j$K5DO@$,==J,$G$O$J$$$N$Ge(B 1.9.3 e$B$rL;X$7$F5DO@$9$k$H$$$$$H;We(B
e$B$&$s$G$9$,!"$I$&$G$7$g$&$+!J$D$^$j!"e(B2e$B%v7n$G<}B+$9$k$H$O;W$($^$;$s!K!#e (B
e$BL@$i$+$K8e$+$iB-$7$F$b:$$i$J$$$b$N$G$O$“$k$N$G!”$f$C$/$j;EMM$rN}$j$^$9$+!#e (B
e$B$?$H$($P!“e(BRails e$B$@$H?t==e(BMBe$B$b$N%a%b%j$r$=$l$G>CHq$7$J$$$+!)e(B
e$B$K$D$$$F$O!”:{ED$5$s$K$@$1$O$OC$7$7$^$7$?$,5/F0% %W%7%g%s$Ge(B
e$B05=L$7$F;}$De(B
e$B;}$?$J$$e(B
e$B$J$I$bA*$Y$k$HNI$$$N$G$O$J$$$+$H;W$$$^$9!#e (B
Yuki_S
February 28, 2010, 1:49pm
5
e$B%A%1%C%He(B #2080 e$B$,99?7$5$l$^$7$?!#e (B (by Yusuke E.)
Target version 1.9.2e$B$+$ie(B1.9.xe$B$KJQ99e(B
e$B1sF#$G$9!#e (B
e$B!!;d$bJXMx$@$H;W$&$s$G$9$,!“$A$g$C$HJXMx$9$.$@$7!”;EMM$N8!F$$b!“@($/<+M3e(B
e$BEY$N$”$k$o$j$K5DO@$,==J,$G$O$J$$$N$Ge(B 1.9.3 e$B$rL;X$7$F5DO@$9$k$H$$$$$H;We(B
e$B$&$s$G$9$,!"$I$&$G$7$g$&$+!J$D$^$j!"e(B2e$B%v7n$G<}B+$9$k$H$O;W$($^$;$s!K!#e (B
1.9.2 e$B$K$OF~$i$J$$!"$H$$$&$3$H$G!"e(BTarget version
e$B$rJQ99$7$^$9!#e (B
1.9.2 will not include this feature.
This ticket just remains for further discussion to aim to include
this feature in 1.9.3 or later.
http://redmine.ruby-lang.org/issues/show/2080
Yuki_S
December 22, 2009, 2:50pm
6
e$B%A%1%C%He(B #2080 e$B$,99?7$5$l$^$7$?!#e (B (by Roger P.)
Note that you can “reget” source by using #source_location (except for
dynamic methods).
Maybe an iseq “reverse compiler” would be helpful for dynamic methods
[and/or instead of this]?
-r
http://redmine.ruby-lang.org/issues/show/2080