Runtime evaluation: Difference between revisions

From Rosetta Code
Content added Content deleted
(Add Python)
(expand task a bit, mark incorrect existing lacks of input/output discussion)
Line 1: Line 1:
{{task}} Demonstrate your language's ability for programs to execute other programs in the language provided at runtime. Show us how you get values in and out (e.g. environments, arguments, return values), and what facilities for restricting (e.g. sandboxes, resource limits) or specializing (e.g. debugging facilities) the execution.
{{task}} Demonstrate your language's ability for programs to execute other programs in the language provided at runtime. Show us what kind of program( fragment)s are permitted (e.g. expressions vs. statements), how you get values in and out (e.g. environments, arguments, return values), and what facilities for restricting (e.g. sandboxes, resource limits) or specializing (e.g. debugging facilities) the execution.


You may not invoke a separate evaluator program, or invoke a compiler and then its output, unless the interface of that program, and the syntax and means of executing it, are considered part of your language/library/platform.
You may not invoke a separate evaluator program, or invoke a compiler and then its output, unless the interface of that program, and the syntax and means of executing it, are considered part of your language/library/platform.
Line 6: Line 6:


=={{header|ALGOL 68}}==
=={{header|ALGOL 68}}==

{{incorrect|ALGOL 68|It does not discuss passing in values.}}

<!-- {{does not work with|ALGOL 68|Standard - variable names are not visible at run time with classic compilers.}} -->
<!-- {{does not work with|ALGOL 68|Standard - variable names are not visible at run time with classic compilers.}} -->
{{works with|ALGOL 68G|Any - tested with release mk15-0.8b.fc9.i386 - this implementation is an interpretor, and ''evaluate'' is an extension to the standard}}
{{works with|ALGOL 68G|Any - tested with release mk15-0.8b.fc9.i386 - this implementation is an interpretor, and ''evaluate'' is an extension to the standard}}
Line 41: Line 44:


=={{header|Groovy}}==
=={{header|Groovy}}==
{{incorrect|Groovy|It does not discuss passing in or returning values.}}

This program evaluates the Groovy program solution to the "[[Yuletide Holiday]]" task:
This program evaluates the Groovy program solution to the "[[Yuletide Holiday]]" task:
<lang Groovy>new GroovyShell().evaluate '''
<lang Groovy>new GroovyShell().evaluate '''
Line 58: Line 63:


=={{header|Perl}}==
=={{header|Perl}}==
{{incorrect|Perl|It does not discuss passing in or returning values.}}

<lang perl>eval '4 + 5'</lang>
<lang perl>eval '4 + 5'</lang>


=={{header|Python}}==
=={{header|Python}}==
{{incorrect|Python|It does not discuss passing in or returning values.}}
<lang python>>>> exec '''
<lang python>>>> exec '''
x = sum([1,2,3,4])
x = sum([1,2,3,4])
Line 68: Line 76:


=={{header|Scheme}}==
=={{header|Scheme}}==
{{incorrect|Scheme|It does not discuss passing in or returning values.}}

This is very similar to the [[Eval#Common Lisp|Common Lisp]] above.
This is very similar to the [[Eval#Common Lisp|Common Lisp]] above.
<lang scheme>> (eval '(+ 4 5))
<lang scheme>> (eval '(+ 4 5))
Line 76: Line 86:


=={{header|Smalltalk}}==
=={{header|Smalltalk}}==
{{incorrect|Smalltalk|It does not discuss passing in or returning values, and it does not show taking in an arbitrary program as from user input.}}
<lang smalltalk>
<lang smalltalk>
[ 4 + 5 ] value.</lang>
[ 4 + 5 ] value.</lang>


=={{header|Tcl}}==
=={{header|Tcl}}==
{{incorrect|Tcl|It does not discuss passing in or returning values.}}
<lang tcl>
<lang tcl>
eval "expr {4 + 5}" ;# string input
eval "expr {4 + 5}" ;# string input

Revision as of 18:03, 25 May 2009

Task
Runtime evaluation
You are encouraged to solve this task according to the task description, using any language you may know.

Demonstrate your language's ability for programs to execute other programs in the language provided at runtime. Show us what kind of program( fragment)s are permitted (e.g. expressions vs. statements), how you get values in and out (e.g. environments, arguments, return values), and what facilities for restricting (e.g. sandboxes, resource limits) or specializing (e.g. debugging facilities) the execution.

You may not invoke a separate evaluator program, or invoke a compiler and then its output, unless the interface of that program, and the syntax and means of executing it, are considered part of your language/library/platform.

For a more restricted task, see Eval in environment.

ALGOL 68

This example is incorrect. Please fix the code and remove this message.

Details: It does not discuss passing in values.

Works with: ALGOL 68G version Any - tested with release mk15-0.8b.fc9.i386 - this implementation is an interpretor, and evaluate is an extension to the standard

Variable names are generally not visible at run time with classic compilers. However ALGOL 68G is an interpretor and it retains this ability. <lang algol>print(evaluate("4.0*arctan(1.0)"))</lang> Output:

+3.14159265358979e  +0

Common Lisp

<lang lisp>(eval '(+ 4 5))</lang>

returns 9.

In Common Lisp, programs are represented as trees (s-expressions). Therefore, it is easily possible to construct a program which includes externally specified values, particularly using backquote template syntax:

<lang lisp>(defun add-four-complicated (a-number)

 (eval `(+ 4 ',a-number)))</lang>

Or you can construct a function and then call it. (If the function is used more than once, it would be good to use compile instead of eval, which compiles the code before returning the function. eval is permitted to compile as well, but compile requires it.)

<lang lisp>(defun add-four-by-function (a-number)

 (funcall (eval '(lambda (n) (+ 4 n)))) a-number)</lang>

If your program came from a file or user input, then you have it as a string, and read or read-from-string will convert it to s-expression form: <lang lisp>(eval (read-from-string "(+ 4 5)"))</lang>

Common Lisp has lexical scope, but eval always evaluates “in the null lexical environment”. In particular, it does not inherit the lexical environment from the enclosing code. (Note that eval is an ordinary function and as such does not have access to that environment anyway.)

<lang lisp>(let ((x 1))

 (eval `(+ x 1)))   ; this will fail unless x is a special variable or has a dynamic binding</lang>

Groovy

This example is incorrect. Please fix the code and remove this message.

Details: It does not discuss passing in or returning values.

This program evaluates the Groovy program solution to the "Yuletide Holiday" task: <lang Groovy>new GroovyShell().evaluate def inFormat = new java.text.SimpleDateFormat("yyyy-MM-dd") def checkFormat = new java.text.SimpleDateFormat("EEE")

def result = (2008..2121).findAll {

   Date date = inFormat.parse("${it}-12-25")
   checkFormat.format(date) == "Sun"

}

println result </lang>

Output:

[2011, 2016, 2022, 2033, 2039, 2044, 2050, 2061, 2067, 2072, 2078, 2089, 2095, 2101, 2107, 2112, 2118]

Perl

This example is incorrect. Please fix the code and remove this message.

Details: It does not discuss passing in or returning values.

<lang perl>eval '4 + 5'</lang>

Python

This example is incorrect. Please fix the code and remove this message.

Details: It does not discuss passing in or returning values.

<lang python>>>> exec x = sum([1,2,3,4]) print x 10</lang>

Scheme

This example is incorrect. Please fix the code and remove this message.

Details: It does not discuss passing in or returning values.

This is very similar to the Common Lisp above. <lang scheme>> (eval '(+ 4 5)) 9 > (print (eval (read))) (+ 4 5) ;; this is input from the user. 9</lang>

Smalltalk

This example is incorrect. Please fix the code and remove this message.

Details: It does not discuss passing in or returning values, and it does not show taking in an arbitrary program as from user input.

<lang smalltalk> [ 4 + 5 ] value.</lang>

Tcl

This example is incorrect. Please fix the code and remove this message.

Details: It does not discuss passing in or returning values.

<lang tcl> eval "expr {4 + 5}"  ;# string input

eval [list expr [list 4 + 5]] ;# list input </lang>