Name: LuaJIT 2012-02-25 0:48
LuaJIT
var foo = [0];
foo == foo // true
foo == !foo // true
function car(l) return l[1] end
function cdr(l) return l[2] end
function cons(a,l) return {a,l} end
function map1(f,l)
local r
if l then
return cons(f(car(l),map1(f,cdr(l)))
end
end
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
t = {action = "learn lua before finding fault with it"}
setmetatable(t, {__tostring = function(instructions) return "You should really " .. instructions.action end})
print(t)
You should really learn lua before finding fault with it
char *s = "abc"; putchar(s[1]); works but putchar("abc[1]"); fails. Not understand the lexical conventions of the language you're programming in does not make the language inconsistent.
Lisp | C/C++
-------|-----------------------------------------------------
format | printf fprintf sprintf snprintf vsprintf vfprintf vsprintf vsnprint
| asprintf vasprintf dprintf vdprintf wprintf putchar fputchar putwchar
| putc fputc fputwc puts fputs fputws write fwrite
| ostream ofstream streambuf streingstream ostringstream stringbuf
| fstream filebuf ios ios_base cout cerr std clog << endl ends hex oct
| boolalpha dec flush internal setw noboolalpha noshowbase noshowpos left
| right resetiosflags scientific setbase setfill setiosflags setprecision
| showbase showpoint showpos skipws unitbuf nouppercase uppercase ws
C/C++ | Lisp
---------|---------------------------------------------------
vfprintf | format write prin1 princ print pprint
| copy-pprint-dispatch formatter pprint-dispatch
| pprint-exit-if-list-exhausted pprint-fill
| pprint-linear pprint-tabular pprint-indent
| pprint-logical-block pprint-newline pprint-pop
| pprint-tab print-object print-unreadable-object
| set-print-dispatch write-to-string prin1-to-string
| princ-to-string *print-array* *print-base*
| *print-radix* *print-case* *print-circle*
| *print-escape* *print-gensym* *print-level*
| *print-length* *print-lines* *print-miser-width*
| *print-pprint-dispatch* *print-pretty*
| *print-readably* *print-right-margin*
| print-not-readable print-not-readable-object
(display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline) (display) (newline)
(define (eval exp env)
(cond ((self-evaluating? exp) exp)
((variable? exp) (lookup-variable-value exp env))
((quoted? exp) (text-of-quotation exp))
((assignment? exp) (eval-assignment exp env))
((definition? exp) (eval-definition exp env))
((if? exp) (eval-if exp env))
((lambda? exp)
(make-procedure (lambda-parameters exp)
(lambda-body exp)
env))
((begin? exp)
(eval-sequence (begin-actions exp) env))
((cond? exp) (eval (cond->if exp) env))
((application? exp)
(apply (eval (operator exp) env)
(list-of-values (operands exp) env)))
(else
(error "Unknown expression type - EVAL" exp))))
#include <unistd.h>
int main(int argc, char* argv[])
{
(void) argc;
execvp("diff", argv);
return -1;
}
object *eval(object *exp, object *env) {
object *seq, *var, *val, *proc, *args;
while (!is_self_evaluating(exp)) {
if (is_variable(exp))
return lookup_variable_value(exp, env);
if (is_quoted(exp)) {
return cadr(exp);
} else if (is_quasiquoted(exp)) {
return eval_quasiquote(cadr(exp), env);
} else if (is_delay(exp)) {
return compound(cons(nil, cdr(exp)), env);
} else if (is_lambda(exp)) {
return compound(cdr(exp), env);
} else if (is_definition(exp)) {
seq = cdr(exp);
if (is_symbol(car(seq))) {
return define_variable(car(seq), eval(cadr(seq), env), env);
} else {
var = caar(seq);
val = make_lambda(cdar(seq), cdr(seq));
exp = cons(car(exp), cons(var, cons(val, nil)));
}
} else if (is_assignment(exp)) {
return set_variable_value(cadr(exp), eval(caddr(exp), env), env);
} else if (is_if(exp)) {
if (is_true(eval(cadr(exp), env)))
exp = caddr(exp);
else if (cdddr(exp))
exp = cadddr(exp);
else
return boolean(false);
} else if (is_cond(exp)) {
for (seq = cdr(exp); seq; seq = cdr(seq))
if (is_tagged_list(car(seq), "else") ||
is_true(eval(caar(seq), env))) {
for (seq = cdar(seq); cdr(seq); seq = cdr(seq))
eval(car(seq), env);
break;
}
if (!seq)
return boolean(false);
exp = car(seq);
} else if (is_case(exp)) {
val = eval(cadr(exp), env);
for (exp = cddr(exp); exp; exp = cdr(exp))
for (seq = caar(exp); seq; seq = cdr(seq))
if (is_eq(seq, symbol("else")) || is_eqv(car(seq), val)) {
for (seq = cdar(exp); cdr(seq); seq = cdr(seq))
eval(car(seq), env);
break;
}
if (!seq)
return boolean(false);
exp = car(seq);
} else if (is_begin(exp)) {
for (seq = cdr(exp); seq && cdr(seq); seq = cdr(seq))
eval(car(seq), env);
if (!seq)
return nil;
exp = car(seq);
} else if (is_and(exp)) {
for (seq = cdr(exp); seq && cdr(seq); seq = cdr(seq))
if (is_false(eval(car(seq), env)))
return boolean(false);
if (!seq)
return boolean(true);
exp = car(seq);
} else if (is_or(exp)) {
for (seq = cdr(exp); seq && cdr(seq); seq = cdr(seq))
if (is_true(val = eval(car(seq), env)))
return val;
if (!seq)
return boolean(false);
exp = car(seq);
} else if (is_let(exp)) {
var = val = nil;
for (seq = cadr(exp); seq; seq = cdr(seq)) {
var = cons(caar(seq), var);
val = cons(eval(cadar(seq), env), val);
}
env = extend_environment(var, val, env);
for (seq = cddr(exp); cdr(seq); seq = cdr(seq))
eval(car(seq), env);
exp = car(seq);
} else if (is_let_star(exp)) {
env = environment(env);
for (seq = cadr(exp); seq; seq = cdr(seq))
append_variable(caar(seq), eval(cadar(seq), env), env);
for (seq = cddr(exp); cdr(seq); seq = cdr(seq))
eval(car(seq), env);
exp = car(seq);
} else if (is_application(exp)) {
proc = eval(car(exp), env);
args = list_of_values(cdr(exp), env);
if (is_compound(proc)) {
seq = to_compound(proc).proc;
env = to_compound(proc).env;
env = extend_environment(car(seq), args, env);
for (seq = cdr(seq); seq && cdr(seq); seq = cdr(seq))
eval(car(seq), env);
exp = car(seq);
} else if (is_primitive(proc)) {
return to_primitive(proc)(args);
} else {
error("apply", "not applicable", proc);
}
} else {
error("eval", "unknown expression type", exp);
}
}
return exp;
}