Reflection/Get source: Difference between revisions
(creation: JavaScript, Python, Ruby) |
(J draft) |
||
Line 3: | Line 3: | ||
;Task: |
;Task: |
||
The goal is to get the source code or file path and line number where a programming object (e.g. module, class, function, method) is defined. |
The goal is to get the source code or file path and line number where a programming object (e.g. module, class, function, method) is defined. |
||
=={{header|J}}== |
|||
Source code which when executed will recreate the definition can be obtained using <code>5!:5 <'name'</code> where ''name'' is the name of the thing you want source code for. Or, you can use 5!:6 which will provide a "fully parenthesized" variant for the tacit part of any definition. |
|||
You can also use 4!:4 and 4!:3 to find the file containing the name's definition (if there is one). Line number is not tracked. |
|||
Examples: |
|||
<lang J> mean=:+/ %# |
|||
5!:5 <'mean' |
|||
+/ % # |
|||
5!:6 <'mean' |
|||
(+/) % # |
|||
4!:4 <'mean' |
|||
_1 |
|||
4!:4 <'names' |
|||
2 |
|||
2 { 4!:3 '' |
|||
┌────────────────────────────────────────────┐ |
|||
│/Applications/j64-804/system/main/stdlib.ijs│ |
|||
└────────────────────────────────────────────┘</lang> |
|||
We could also provide convenience functions for these mechanisms: |
|||
<lang J> linrep=: 5!:5@< |
|||
srcfile=: (4!:4@<) { a:,~ 4!:3 bind ''</lang> |
|||
Example use: |
|||
<lang J> linrep 'names' |
|||
list_z_@nl |
|||
srcfile 'names' |
|||
┌────────────────────────────────────────────┐ |
|||
│/Applications/j64-804/system/main/stdlib.ijs│ |
|||
└────────────────────────────────────────────┘ |
|||
srcfile 'mean' |
|||
┌┐ |
|||
││ |
|||
└┘</lang> |
|||
=={{header|JavaScript}}== |
=={{header|JavaScript}}== |
Revision as of 13:40, 22 July 2016
You are encouraged to solve this task according to the task description, using any language you may know.
- Task
The goal is to get the source code or file path and line number where a programming object (e.g. module, class, function, method) is defined.
J
Source code which when executed will recreate the definition can be obtained using 5!:5 <'name'
where name is the name of the thing you want source code for. Or, you can use 5!:6 which will provide a "fully parenthesized" variant for the tacit part of any definition.
You can also use 4!:4 and 4!:3 to find the file containing the name's definition (if there is one). Line number is not tracked.
Examples:
<lang J> mean=:+/ %#
5!:5 <'mean'
+/ % #
5!:6 <'mean'
(+/) % #
4!:4 <'mean'
_1
4!:4 <'names'
2
2 { 4!:3
┌────────────────────────────────────────────┐ │/Applications/j64-804/system/main/stdlib.ijs│ └────────────────────────────────────────────┘</lang>
We could also provide convenience functions for these mechanisms:
<lang J> linrep=: 5!:5@<
srcfile=: (4!:4@<) { a:,~ 4!:3 bind </lang>
Example use:
<lang J> linrep 'names' list_z_@nl
srcfile 'names'
┌────────────────────────────────────────────┐ │/Applications/j64-804/system/main/stdlib.ijs│ └────────────────────────────────────────────┘
srcfile 'mean'
┌┐ ││ └┘</lang>
JavaScript
Function.toString()
will return the source code for user-defined functions.
<lang javascript>function foo() {...} foo.toString(); // "function foo() {...}" </lang>
For native functions, the function body typically will be a syntactically invalid string indicating the function is native. This behavior isn't part of any ECMAScript standard, but is common practice. <lang javascript>Math.sqrt.toString(); // "function sqrt() { [native code] }" </lang>
Python
Modules loaded from files have a __file__
attribute.
<lang python>import os
os.__file__
- "/usr/local/lib/python3.5/os.pyc"
</lang>
Ruby
Method#source_location
will return the file and line number of a Ruby method. If a method wasn't defined in Ruby, Method#source_location
returns nil.
<lang ruby>require 'mathn'
Math.method(:sqrt).source_location
- ["/usr/local/lib/ruby2.3/2.3.0/mathn.rb", 119]
Class.method(:nesting).source_location
- nil, since Class#nesting is native
</lang>