(define (foo ...) ...) actually gives the lambda a name
authorAndy Wingo <wingo@pobox.com>
Fri, 12 Sep 2008 21:11:09 +0000 (23:11 +0200)
committerAndy Wingo <wingo@pobox.com>
Sat, 13 Sep 2008 12:19:20 +0000 (14:19 +0200)
* module/language/scheme/translate.scm (primitive-syntax-table): In forms
  like (define x y) where y is a lambda, and the lambda has no name yet,
  set the lambda's name in its metadata.

module/language/scheme/translate.scm

index 2e8ce9b..87a6130 100644 (file)
     ((,name ,val) (guard (symbol? name)
                          (ghil-toplevel-env? (ghil-env-parent e)))
      (make-ghil-define e l (ghil-define (ghil-env-parent e) name)
-                       (retrans val)))
+                       (maybe-name-value! (retrans val) name)))
     ;; (define (NAME FORMALS...) BODY...)
     (((,name . ,formals) . ,body) (guard (symbol? name))
      ;; -> (define NAME (lambda FORMALS BODY...))
          (values `((documentation . ,(car body))) (cdr body)))
         (else (values '() body))))
 
+(define (maybe-name-value! val name)
+  (cond
+   ((ghil-lambda? val)
+    (if (not (assq-ref (ghil-lambda-meta val) 'name))
+        (set! (ghil-lambda-meta val)
+              (acons 'name name (ghil-lambda-meta val))))))
+  val)
+
 (define (location x)
   (and (pair? x)
        (let ((props (source-properties x)))