# \[Feature #2080\] Proc#to\_source, Method#to\_source

**URL:** <https://www.ruby-forum.com/t/feature-2080-proc-to-source-method-to-source/175292>\
**Category:** Development\
**Created:** [September 10, 2009, 6:13pm UTC](https://www.ruby-forum.com/t/feature-2080-proc-to-source-method-to-source/175292 "2009-09-10T18:13:07Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![Yuki\_S](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/a6a055/32.png) [@Yuki\_S](https://www.ruby-forum.com/u/Yuki_S)\
**Post date:** [September 10, 2009, 6:13pm UTC](https://www.ruby-forum.com/t/feature-2080-proc-to-source-method-to-source/175292/1 "2009-09-10T18:13:07Z")

</div>

Feature #2080: Proc#to\_source, Method#to\_source  
[http://redmine.ruby-lang.org/issues/show/2080](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”

---

<div class="post-metadata">

**Author:** ![Yuki\_S](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/a6a055/32.png) [@Yuki\_S](https://www.ruby-forum.com/u/Yuki_S)\
**Post date:** [September 10, 2009, 7:43pm UTC](https://www.ruby-forum.com/t/feature-2080-proc-to-source-method-to-source/175292/2 "2009-09-10T19:43:17Z")

</div>

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

1. e$B0z?t$O!)e(B  
1.1 e$B%\*%W%7%g%J%k0z?t$O!)e(B
2. C e$B$G=q$$$?%a%=%C%I$O!)e(B
3. 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
4. 

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

---

<div class="post-metadata">

**Author:** ![Yuki\_S](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/a6a055/32.png) [@Yuki\_S](https://www.ruby-forum.com/u/Yuki_S)\
**Post date:** [September 13, 2009, 1:34pm UTC](https://www.ruby-forum.com/t/feature-2080-proc-to-source-method-to-source/175292/3 "2009-09-13T13:34:16Z")

</div>

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](http://redmine.ruby-lang.org/issues/show/2080)

---

<div class="post-metadata">

**Author:** ![Yuki\_S](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/a6a055/32.png) [@Yuki\_S](https://www.ruby-forum.com/u/Yuki_S)\
**Post date:** [September 14, 2009, 1:52pm UTC](https://www.ruby-forum.com/t/feature-2080-proc-to-source-method-to-source/175292/4 "2009-09-14T13:52:23Z")

</div>

2009e$BG/e(B9e$B7ne(B11e$BF|e(B2:43 SASADA Koichi [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> 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

---

<div class="post-metadata">

**Author:** ![Yuki\_S](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/a6a055/32.png) [@Yuki\_S](https://www.ruby-forum.com/u/Yuki_S)\
**Post date:** [February 28, 2010, 1:49pm UTC](https://www.ruby-forum.com/t/feature-2080-proc-to-source-method-to-source/175292/5 "2010-02-28T13:49:35Z")

</div>

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.

## – Yusuke E. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

[http://redmine.ruby-lang.org/issues/show/2080](http://redmine.ruby-lang.org/issues/show/2080)

---

<div class="post-metadata">

**Author:** ![Yuki\_S](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/a6a055/32.png) [@Yuki\_S](https://www.ruby-forum.com/u/Yuki_S)\
**Post date:** [December 22, 2009, 2:50pm UTC](https://www.ruby-forum.com/t/feature-2080-proc-to-source-method-to-source/175292/6 "2009-12-22T14:50:17Z")

</div>

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](http://redmine.ruby-lang.org/issues/show/2080)
