summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--eval.c10
-rw-r--r--share/txr/stdlib/place.tl8
-rw-r--r--txr.130
3 files changed, 33 insertions, 15 deletions
diff --git a/eval.c b/eval.c
index 714b86a1..7268f893 100644
--- a/eval.c
+++ b/eval.c
@@ -550,6 +550,8 @@ val lookup_fun(val env, val sym)
}
} else if (car(sym) == macro_s) {
return lookup_mac(nil, cadr(sym));
+ } else if (car(sym) == lambda_s) {
+ return cons(sym, func_interp(env, sym));
} else {
return nil;
}
@@ -1532,9 +1534,6 @@ static val do_eval(val form, val env, val ctx,
} else {
val fbinding = lookup_fun(env, oper);
- if (!fbinding && consp(oper) && car(oper) == lambda_s)
- fbinding = cons(oper, func_interp(env, oper));
-
if (!fbinding) {
last_form_evaled = form;
eval_error(form, lit("~s does not name a function or operator"), oper, nao);
@@ -1855,11 +1854,8 @@ static val op_fun(val form, val env)
val name = second(form);
val fbinding = lookup_fun(env, name);
- if (!fbinding) {
- if (consp(name) && car(name) == lambda_s)
- return func_interp(env, name);
+ if (!fbinding)
eval_error(form, lit("no function exists named ~s"), name, nao);
- }
return cdr(fbinding);
}
diff --git a/share/txr/stdlib/place.tl b/share/txr/stdlib/place.tl
index 0aef499a..9fa15bdc 100644
--- a/share/txr/stdlib/place.tl
+++ b/share/txr/stdlib/place.tl
@@ -776,7 +776,7 @@
^(fmakunbound ',',sym)))
,body)))
-(defun sys:get-fun-getter-setter (sym)
+(defun sys:get-fun-getter-setter (f sym)
(tree-case sym
((type struct slot)
(if (eq type 'meth)
@@ -795,6 +795,10 @@
(cons (op cdr)
(op sys:rplacd cell)))
:))
+ ((op . rest)
+ (if (eq op 'lambda)
+ (compile-error f "cannot assign to lambda")
+ (compile-error f "invalid function syntax ~s" sym)))
(else
(let ((cell (or (gethash sys:top-fb sym)
(sethash sys:top-fb sym (cons sym nil)))))
@@ -804,7 +808,7 @@
(defplace (symbol-function sym-expr) body
(getter setter
(with-gensyms (gs-sym)
- ^(let ((,gs-sym (sys:get-fun-getter-setter ,sym-expr)))
+ ^(let ((,gs-sym (sys:get-fun-getter-setter ',sys:*pl-form* ,sym-expr)))
(macrolet ((,getter () ^(call (car ,',gs-sym)))
(,setter (val) ^(call (cdr ,',gs-sym) ,val)))
,body))))
diff --git a/txr.1 b/txr.1
index 75695f3e..6586d9fe 100644
--- a/txr.1
+++ b/txr.1
@@ -16747,10 +16747,10 @@ returns
.SS* Global Environment
.coNP Accessors @, symbol-function @ symbol-macro and @ symbol-value
.synb
-.mets (symbol-function >> { symbol | << method-name } )
+.mets (symbol-function >> { symbol | < method-name | << lambda-expr })
.mets (symbol-macro << symbol )
.mets (symbol-value << symbol )
-.mets (set (symbol-function << symbol ) << new-value )
+.mets (set (symbol-function >> { symbol | << method-name }) << new-value )
.mets (set (symbol-macro << symbol ) << new-value )
.mets (set (symbol-value << symbol ) << new-value )
.syne
@@ -16797,6 +16797,13 @@ which denote macros. Thus,
.code symbol-function
provides unified access to functions, methods and macros.
+If a
+.code lambda
+expression is passed to
+.codn symbol-function ,
+then the function implied by that expression is returned.
+It is unspecified whether this function is interpreted or compiled.
+
The
.code symbol-macro
function retrieves the value of the global macro binding of
@@ -16883,6 +16890,10 @@ Storing a value, using any one of these three accessors, to a nonexistent
variable, function or macro binding, is not erroneous. It has has the effect of
creating that binding.
+Using
+.code symbol-function
+accessor to assign to a lambda expression is erroneous.
+
Deleting a binding, using any of these three accessors, when the binding does not
exist, also isn't erroneous. There is no effect and the
.code del
@@ -16905,22 +16916,29 @@ function doesn't exist in Common Lisp.
.coNP Functions @, boundp @ fboundp and @ mboundp
.synb
.mets (boundp << symbol )
-.mets (fboundp << symbol )
+.mets (fboundp >> { symbol | < method-name | << lambda-expr })
.mets (mboundp << symbol )
.syne
.desc
.code boundp
returns
.code t
-if the symbol is bound as a variable or symbol macro in the global
+if the
+.meta symbol
+is bound as a variable or symbol macro in the global
environment, otherwise
.codn nil .
.code fboundp
returns
.code t
-if the symbol has a function binding in the global
-environment, otherwise it returns nil
+if the
+.meta symbol
+has a function binding in the global
+environment, the method specified by
+.meta method-name
+exists, or a lambda expression argument is given.
+Otherwise it returns nil
.codn nil .
.code mboundp