Avoid consing an unbound-arg marker in the evaluator
[bpt/guile.git] / module / ice-9 / eval.scm
index f95bbe9..ef82de4 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*- mode: scheme; coding: utf-8; -*-
 
-;;;; Copyright (C) 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
+;;;; Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc.
 ;;;;
 ;;;; This library is free software; you can redistribute it and/or
 ;;;; modify it under the terms of the GNU Lesser General Public
     ;; of arguments, and some rest arities; see make-fixed-closure and
     ;; make-rest-closure above.
 
-    ;; A unique marker for unbound keywords.
-    (define unbound-arg (list 'unbound-arg))
+    ;; A unique marker for unbound keywords.  NB: There should be no
+    ;; other instance of '(unbound-arg) in this compilation unit, so
+    ;; that this marker is indeed unique.  It's a hack, but it allows
+    ;; the constant to propagate to inner closures, reducing free
+    ;; variable counts all around, so it is important for perf.
+    (define unbound-arg '(unbound-arg))
 
     ;; Procedures with rest, optional, or keyword arguments, potentially with
     ;; multiple arities, as with case-lambda.