Runtime evaluation: Difference between revisions

From Rosetta Code
Content added Content deleted
(expand CL example into the kind of discussion I intended all examples to have)
Line 7: Line 7:
=={{header|Common Lisp}}==
=={{header|Common Lisp}}==


<lang lisp>(eval '(+ 4 5))</lang>
===Using a list to represent code===

<lang lisp>(eval '(+ 4 5)) ; Evaluate the program (+ 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 <code>[http://www.lispworks.com/documentation/HyperSpec/Body/f_cmp.htm compile]</code> instead of <code>eval</code>, which compiles the code before returning the function. <code>eval</code> is permitted to compile as well, but <code>compile</code> 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 [http://www.lispworks.com/documentation/HyperSpec/Body/f_rd_rd.htm 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 <code>eval</code> always evaluates “in the null lexical environment”. In particular, it does not inherit the lexical environment from the enclosing code. (Note that <code>eval</code> 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>


===Using a String to represent code===
<lang lisp>(eval (read-from-string "(+ 4 5)")) ; Evaluate the program (+ 4 5)</lang>


=={{header|Groovy}}==
=={{header|Groovy}}==

Revision as of 11:55, 15 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 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.

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

result = [] (2008..2121).each {

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

}

print result </lang>

Output:

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

Perl

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

Smalltalk

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

Tcl

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

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