import rl from './node_readline.js'
const readline = rl.readline
-import { _list_Q, _malfunc, _malfunc_Q } from './types'
+import { _clone, _list_Q, _malfunc, _malfunc_Q } from './types'
import { BlankException, read_str } from './reader'
import { pr_str } from './printer'
import { new_env, env_set, env_get } from './env'
ast = quasiquote(a1)
break // continue TCO loop
case 'defmacro!':
- let func = EVAL(a2, env)
+ let func = _clone(EVAL(a2, env))
func.ismacro = true
return env_set(env, a1, func)
case 'macroexpand':
import rl from './node_readline.js'
const readline = rl.readline
-import { _list_Q, _malfunc, _malfunc_Q } from './types'
+import { _clone, _list_Q, _malfunc, _malfunc_Q } from './types'
import { BlankException, read_str } from './reader'
import { pr_str } from './printer'
import { new_env, env_set, env_get } from './env'
ast = quasiquote(a1)
break // continue TCO loop
case 'defmacro!':
- let func = EVAL(a2, env)
+ let func = _clone(EVAL(a2, env))
func.ismacro = true
return env_set(env, a1, func)
case 'macroexpand':
import rl from './node_readline.js'
const readline = rl.readline
-import { _list_Q, _malfunc, _malfunc_Q } from './types'
+import { _clone, _list_Q, _malfunc, _malfunc_Q } from './types'
import { BlankException, read_str } from './reader'
import { pr_str } from './printer'
import { new_env, env_set, env_get } from './env'
ast = quasiquote(a1)
break // continue TCO loop
case 'defmacro!':
- let func = EVAL(a2, env)
+ let func = _clone(EVAL(a2, env))
func.ismacro = true
return env_set(env, a1, func)
case 'macroexpand':
ast = quasiquote(a1);
break;
case 'defmacro!':
- var func = EVAL(a2, env);
+ var func = types._clone(EVAL(a2, env));
func._ismacro_ = true;
return env.set(a1, func);
case 'macroexpand':
ast = quasiquote(a1);
break;
case 'defmacro!':
- var func = EVAL(a2, env);
+ var func = types._clone(EVAL(a2, env));
func._ismacro_ = true;
return env.set(a1, func);
case 'macroexpand':
ast = quasiquote(a1);
break;
case 'defmacro!':
- var func = EVAL(a2, env);
+ var func = types._clone(EVAL(a2, env));
func._ismacro_ = true;
return env.set(a1, func);
case 'macroexpand':
ast = quasiquote(ast[1]);
# Continue loop (TCO)
elif 'defmacro!' == a0:
- func = EVAL(ast[2], env)
+ func = types._clone(EVAL(ast[2], env))
func._ismacro_ = True
return env.set(ast[1], func)
elif 'macroexpand' == a0:
ast = quasiquote(ast[1]);
# Continue loop (TCO)
elif 'defmacro!' == a0:
- func = EVAL(ast[2], env)
+ func = types._clone(EVAL(ast[2], env))
func._ismacro_ = True
return env.set(ast[1], func)
elif 'macroexpand' == a0:
ast = quasiquote(ast[1]);
# Continue loop (TCO)
elif 'defmacro!' == a0:
- func = EVAL(ast[2], env)
+ func = types._clone(EVAL(ast[2], env))
func._ismacro_ = True
return env.set(ast[1], func)
elif 'macroexpand' == a0:
when :quasiquote
ast = quasiquote(a1); # Continue loop (TCO)
when :defmacro!
- func = EVAL(a2, env)
+ func = EVAL(a2, env).clone
func.is_macro = true
return env.set(a1, func)
when :macroexpand
when :quasiquote
ast = quasiquote(a1); # Continue loop (TCO)
when :defmacro!
- func = EVAL(a2, env)
+ func = EVAL(a2, env).clone
func.is_macro = true
return env.set(a1, func)
when :macroexpand
when :quasiquote
ast = quasiquote(a1); # Continue loop (TCO)
when :defmacro!
- func = EVAL(a2, env)
+ func = EVAL(a2, env).clone
func.is_macro = true
return env.set(a1, func)
when :macroexpand