<div dir="ltr">Is this really important enough to request addition to 6.0 given that it likely won't be included in the testing builds?<div><br></div><div>Robby</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">
On Mon, Dec 16, 2013 at 10:07 AM,  <span dir="ltr"><<a href="mailto:mflatt@racket-lang.org" target="_blank">mflatt@racket-lang.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
mflatt has updated `master' from 37dd4fc2b0 to 1ceca069c8.<br>
  <a href="http://git.racket-lang.org/plt/37dd4fc2b0..1ceca069c8" target="_blank">http://git.racket-lang.org/plt/37dd4fc2b0..1ceca069c8</a><br>
<br>
=====[ One Commit ]=====================================================<br>
Directory summary:<br>
   8.8% pkgs/racket-pkgs/racket-doc/syntax/scribblings/<br>
  19.4% pkgs/racket-pkgs/racket-test/tests/racket/<br>
  47.6% racket/collects/racket/private/<br>
  24.1% racket/src/racket/src/<br>
<br>
~~~~~~~~~~<br>
<br>
1ceca06 Matthew Flatt <<a href="mailto:mflatt@racket-lang.org">mflatt@racket-lang.org</a>> 2013-12-16 08:16<br>
:<br>
| more repairs to function-name inference<br>
|<br>
| The main change is to add an option to `syntax-local-infer-name` to<br>
| select whether `syntax-local-name` is used, and to use the new option<br>
| to disable `syntax-local-name` for the function expression in a<br>
| keyword `#%app`.<br>
|<br>
| Improvements in the expander/compiler generalize a previous repair.<br>
|<br>
| Merge to v6.0<br>
:<br>
  M racket/collects/racket/private/kw.rkt             |  2 +-<br>
  M racket/collects/racket/private/name.rkt           | 52 +++++++++++---------<br>
  M .../racket-doc/syntax/scribblings/name.scrbl      | 10 ++--<br>
  M racket/src/racket/src/compile.c                   | 29 ++++++-----<br>
  M racket/src/racket/src/eval.c                      |  9 ++--<br>
  M racket/src/racket/src/module.c                    |  2 +-<br>
  M racket/src/racket/src/schpriv.h                   |  3 +-<br>
  M .../racket-test/tests/racket/name.rktl            | 23 +++++++++<br>
<br>
=====[ Overall Diff ]===================================================<br>
<br>
pkgs/racket-pkgs/racket-doc/syntax/scribblings/name.scrbl<br>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>
--- OLD/pkgs/racket-pkgs/racket-doc/syntax/scribblings/name.scrbl<br>
+++ NEW/pkgs/racket-pkgs/racket-doc/syntax/scribblings/name.scrbl<br>
@@ -5,12 +5,16 @@<br>
<br>
 @defmodule[syntax/name]<br>
<br>
-@defproc[(syntax-local-infer-name [stx syntax?]) any/c]{<br>
+@defproc[(syntax-local-infer-name [stx syntax?] [use-local? any/c #t]) any/c]{<br>
<br>
-Similar to @racket[syntax-local-name] except that @racket[stx] is<br>
+Similar to @racket[syntax-local-name], except that @racket[stx] is<br>
 checked for an @racket['inferred-name] property (which overrides any<br>
 inferred name). If neither @racket[syntax-local-name] nor<br>
 @racket['inferred-name] produce a name, or if the<br>
 @racket['inferred-name] property value is @|void-const|, then a name<br>
 is constructed from the source-location information in @racket[stx],<br>
-if any. If no name can be constructed, the result is @racket[#f].}<br>
+if any. If no name can be constructed, the result is @racket[#f].<br>
+<br>
+If @racket[use-local?] is @racket[#f], then @racket[syntax-local-name] is<br>
+not used. Provide @racket[use-local?] as @racket[#f] to construct a name<br>
+for a syntax object that is not an expression currently being expanded.}<br>
<br>
pkgs/racket-pkgs/racket-test/tests/racket/name.rktl<br>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>
--- OLD/pkgs/racket-pkgs/racket-test/tests/racket/name.rktl<br>
+++ NEW/pkgs/racket-pkgs/racket-test/tests/racket/name.rktl<br>
@@ -107,5 +107,28 @@<br>
<br>
 (err/rt-test (let ([unmentionable ((lambda (x #:a a) 1) 1 2)]) 5)<br>
              (lambda (exn) (not (regexp-match? #rx"unmentionable" (exn-message exn)))))<br>
+(err/rt-test (let ([unmentionable ((lambda (x #:a a) 1) #:q 1 2)]) 5)<br>
+             (lambda (exn) (not (regexp-match? #rx"unmentionable" (exn-message exn)))))<br>
+<br>
+<br>
+(err/rt-test (let ([mentionable (let ()<br>
+                                  (define v 1)<br>
+                                  (lambda (x #:a a) v))])<br>
+               (mentionable 1 2))<br>
+             (lambda (exn) (regexp-match? #rx"mentionable" (exn-message exn))))<br>
+(err/rt-test (let ([mentionable (let ()<br>
+                                  (define v 1)<br>
+                                  (lambda (x #:a a) v))])<br>
+               (mentionable #:q 1 2))<br>
+             (lambda (exn) (regexp-match? #rx"mentionable" (exn-message exn))))<br>
+<br>
+(syntax-test #'(let-syntax ([fail (lambda (stx)<br>
+                                    (raise-syntax-error 'fail<br>
+                                                        (format "~s" (syntax-local-name))))])<br>
+                 (let ([unmentionable (let ()<br>
+                                        (fail)<br>
+                                        10)])<br>
+                   5))<br>
+             #rx"^(?!.*unmentionable)")<br>
<br>
 (report-errs)<br>
<br>
racket/collects/racket/private/kw.rkt<br>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>
--- OLD/racket/collects/racket/private/kw.rkt<br>
+++ NEW/racket/collects/racket/private/kw.rkt<br>
@@ -918,7 +918,7 @@<br>
                                  (loop (cddr l)))])]<br>
                        [else<br>
                         (cons (car l) (loop (cdr l)))])))])<br>
-            (let ([ids (cons (or (syntax-local-infer-name stx)<br>
+            (let ([ids (cons (or (syntax-local-infer-name stx #f)<br>
                                  'procedure)<br>
                              (generate-temporaries exprs))])<br>
               (let loop ([l (cdr l)]<br>
<br>
racket/collects/racket/private/name.rkt<br>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>
--- OLD/racket/collects/racket/private/name.rkt<br>
+++ NEW/racket/collects/racket/private/name.rkt<br>
@@ -3,27 +3,31 @@<br>
   (#%require "define.rkt" "small-scheme.rkt")<br>
   (#%provide syntax-local-infer-name)<br>
<br>
-  (define (syntax-local-infer-name stx)<br>
-    (let-values ([(prop) (syntax-property stx 'inferred-name)])<br>
-      (or (and prop<br>
-               (not (void? prop))<br>
-               prop)<br>
-          (let ([n (and (not (void? prop))<br>
-                        (syntax-local-name))])<br>
-            (or n<br>
-                (let ([s (syntax-source stx)])<br>
-                  (and s<br>
-                       (let ([s (let ([s (format<br>
-                                          "~a"<br>
-                                          (cond<br>
-                                           [(path? s) (path->string s)]<br>
-                                           [else s]))])<br>
-                                  (if ((string-length s) . > . 20)<br>
-                                      (string-append "..." (substring s (- (string-length s) 20)))<br>
-                                      s))]<br>
-                             [l (syntax-line stx)]<br>
-                             [c (syntax-column stx)])<br>
-                         (if l<br>
-                             (string->symbol (format "~a:~a:~a" s l c))<br>
-                             (let ([p (syntax-position stx)])<br>
-                               (string->symbol (format "~a::~a" s p)))))))))))))<br>
+  (define syntax-local-infer-name<br>
+    (case-lambda<br>
+     [(stx use-local?)<br>
+      (let-values ([(prop) (syntax-property stx 'inferred-name)])<br>
+        (or (and prop<br>
+                 (not (void? prop))<br>
+                 prop)<br>
+            (let ([n (and use-local?<br>
+                          (not (void? prop))<br>
+                          (syntax-local-name))])<br>
+              (or n<br>
+                  (let ([s (syntax-source stx)])<br>
+                    (and s<br>
+                         (let ([s (let ([s (format<br>
+                                            "~a"<br>
+                                            (cond<br>
+                                             [(path? s) (path->string s)]<br>
+                                             [else s]))])<br>
+                                    (if ((string-length s) . > . 20)<br>
+                                        (string-append "..." (substring s (- (string-length s) 20)))<br>
+                                        s))]<br>
+                               [l (syntax-line stx)]<br>
+                               [c (syntax-column stx)])<br>
+                           (if l<br>
+                               (string->symbol (format "~a:~a:~a" s l c))<br>
+                               (let ([p (syntax-position stx)])<br>
+                                 (string->symbol (format "~a::~a" s p)))))))))))]<br>
+     [(stx) (syntax-local-infer-name stx #t)])))<br>
<br>
racket/src/racket/src/compile.c<br>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>
--- OLD/racket/src/racket/src/compile.c<br>
+++ NEW/racket/src/racket/src/compile.c<br>
@@ -2770,7 +2770,7 @@ Scheme_Object *scheme_compile_sequence(Scheme_Object *forms,<br>
     Scheme_Object *first, *val;<br>
<br>
     first = SCHEME_STX_CAR(forms);<br>
-    first = scheme_check_immediate_macro(first, env, rec, drec, 1, &val, NULL, NULL);<br>
+    first = scheme_check_immediate_macro(first, env, rec, drec, 1, &val, NULL, NULL, 0);<br>
<br>
     if (SAME_OBJ(val, scheme_begin_syntax) && SCHEME_STX_PAIRP(first)) {<br>
       /* Flatten begin: */<br>
@@ -4270,7 +4270,8 @@ Scheme_Object *scheme_check_immediate_macro(Scheme_Object *first,<br>
                                            int internel_def_pos,<br>
                                            Scheme_Object **current_val,<br>
                                            Scheme_Comp_Env **_xenv,<br>
-                                           Scheme_Object *ctx)<br>
+                                           Scheme_Object *ctx,<br>
+                                            int keep_name)<br>
 {<br>
   Scheme_Object *name, *val;<br>
   Scheme_Comp_Env *xenv = (_xenv ? *_xenv : NULL);<br>
@@ -4337,7 +4338,7 @@ Scheme_Object *scheme_check_immediate_macro(Scheme_Object *first,<br>
           {<br>
             scheme_init_expand_recs(rec, drec, &erec1, 1);<br>
             erec1.depth = 1;<br>
-            erec1.value_name = rec[drec].value_name;<br>
+            erec1.value_name = (keep_name ? rec[drec].value_name : scheme_false);<br>
             first = scheme_expand_expr(first, xenv, &erec1, 0);<br>
           }<br>
           break; /* break to outer loop */<br>
@@ -4933,16 +4934,11 @@ compile_expand_app(Scheme_Object *orig_form, Scheme_Comp_Env *env,<br>
       /* naya will be prefixed and returned... */<br>
     }<br>
   } else if (rec[drec].comp) {<br>
-    Scheme_Object *name, *origname, *gval, *orig_rest_form, *rest_form, *vname;<br>
+    Scheme_Object *name, *origname, *gval, *orig_rest_form, *rest_form;<br>
     name = SCHEME_STX_CAR(form);<br>
     origname = name;<br>
<br>
-    vname = rec[drec].value_name;<br>
-    rec[drec].value_name = scheme_false;<br>
-<br>
-    name = scheme_check_immediate_macro(name, env, rec, drec, 0, &gval, NULL, NULL);<br>
-<br>
-    rec[drec].value_name = vname;<br>
+    name = scheme_check_immediate_macro(name, env, rec, drec, 0, &gval, NULL, NULL, 0);<br>
<br>
     /* look for ((lambda (x ...) ....) ....) or ((lambda x ....) ....) */<br>
     if (SAME_OBJ(gval, scheme_lambda_syntax)) {<br>
@@ -5054,13 +5050,13 @@ compile_expand_app(Scheme_Object *orig_form, Scheme_Comp_Env *env,<br>
             if (scheme_stx_module_eq(name, cwv_stx, 0)) {<br>
               Scheme_Object *first, *orig_first;<br>
               orig_first = SCHEME_STX_CAR(at_first);<br>
-              first = scheme_check_immediate_macro(orig_first, env, rec, drec, 0, &gval, NULL, NULL);<br>
+              first = scheme_check_immediate_macro(orig_first, env, rec, drec, 0, &gval, NULL, NULL, 0);<br>
               if (SAME_OBJ(gval, scheme_lambda_syntax)<br>
                   && SCHEME_STX_PAIRP(first)<br>
                   && (arg_count(first, env) == 0)) {<br>
                 Scheme_Object *second, *orig_second;<br>
                 orig_second = SCHEME_STX_CAR(at_second);<br>
-                second = scheme_check_immediate_macro(orig_second, env, rec, drec, 0, &gval, NULL, NULL);<br>
+                second = scheme_check_immediate_macro(orig_second, env, rec, drec, 0, &gval, NULL, NULL, 0);<br>
                 if (SAME_OBJ(gval, scheme_lambda_syntax)<br>
                     && SCHEME_STX_PAIRP(second)<br>
                     && (arg_count(second, env) >= 0)) {<br>
@@ -5577,13 +5573,15 @@ compile_expand_block(Scheme_Object *forms, Scheme_Comp_Env *env,<br>
<br>
   {<br>
     Scheme_Object *gval, *result;<br>
-    int more = 1;<br>
+    int more = 1, is_last;<br>
+<br>
+    is_last = SCHEME_STX_NULLP(SCHEME_STX_CDR(forms));<br>
<br>
     result = forms;<br>
<br>
     /* Check for macro expansion, which could mask the real<br>
        define-values, define-syntax, etc.: */<br>
-    first = scheme_check_immediate_macro(first, env, rec, drec, 1, &gval, &xenv, ectx);<br>
+    first = scheme_check_immediate_macro(first, env, rec, drec, 1, &gval, &xenv, ectx, is_last);<br>
<br>
     if (SAME_OBJ(gval, scheme_begin_syntax)) {<br>
       /* Inline content */<br>
@@ -5808,7 +5806,8 @@ compile_expand_block(Scheme_Object *forms, Scheme_Comp_Env *env,<br>
             SCHEME_EXPAND_OBSERVE_NEXT(rec[drec].observer);<br>
             SCHEME_EXPAND_OBSERVE_BLOCK_RENAMES(rec[drec].observer,old_first,first);<br>
           }<br>
-         first = scheme_check_immediate_macro(first, env, rec, drec, 1, &gval, &xenv, ectx);<br>
+          is_last = SCHEME_STX_NULLP(SCHEME_STX_CDR(result));<br>
+         first = scheme_check_immediate_macro(first, env, rec, drec, 1, &gval, &xenv, ectx, is_last);<br>
          more = 1;<br>
          if (NOT_SAME_OBJ(gval, scheme_define_values_syntax)<br>
              && NOT_SAME_OBJ(gval, scheme_define_syntaxes_syntax)) {<br>
<br>
racket/src/racket/src/eval.c<br>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>
--- OLD/racket/src/racket/src/eval.c<br>
+++ NEW/racket/src/racket/src/eval.c<br>
@@ -3980,9 +3980,10 @@ static void *compile_k(void)<br>
       while (1) {<br>
        scheme_frame_captures_lifts(cenv, scheme_make_lifted_defn, scheme_sys_wraps(cenv),<br>
                                     scheme_false, scheme_top_level_lifts_key(cenv), scheme_null, scheme_false);<br>
-       form = scheme_check_immediate_macro(form,<br>
+       form = scheme_check_immediate_macro(form,<br>
                                            cenv, &rec, 0,<br>
-                                           0, &gval, NULL, NULL);<br>
+                                           0, &gval, NULL, NULL,<br>
+                                            1);<br>
        if (SAME_OBJ(gval, scheme_begin_syntax)) {<br>
          if (scheme_stx_proper_list_length(form) > 1){<br>
            form = SCHEME_STX_CDR(form);<br>
@@ -4467,7 +4468,7 @@ static void *expand_k(void)<br>
<br>
     if (just_to_top) {<br>
       Scheme_Object *gval;<br>
-      obj = scheme_check_immediate_macro(obj, env, &erec1, 0, 0, &gval, NULL, NULL);<br>
+      obj = scheme_check_immediate_macro(obj, env, &erec1, 0, 0, &gval, NULL, NULL, 1);<br>
     } else<br>
       obj = scheme_expand_expr(obj, env, &erec1, 0);<br>
<br>
@@ -5036,7 +5037,7 @@ do_local_expand(const char *name, int for_stx, int catch_lifts, int for_expr, in<br>
       drec[0].comp_flags = comp_flags;<br>
     }<br>
<br>
-    xl = scheme_check_immediate_macro(l, env, drec, 0, 0, &gval, NULL, NULL);<br>
+    xl = scheme_check_immediate_macro(l, env, drec, 0, 0, &gval, NULL, NULL, 1);<br>
<br>
     if (SAME_OBJ(xl, l) && !for_expr) {<br>
       SCHEME_EXPAND_OBSERVE_LOCAL_POST(observer, xl);<br>
<br>
racket/src/racket/src/module.c<br>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>
--- OLD/racket/src/racket/src/module.c<br>
+++ NEW/racket/src/racket/src/module.c<br>
@@ -7363,7 +7363,7 @@ static Scheme_Object *do_module(Scheme_Object *form, Scheme_Comp_Env *env,<br>
<br>
   if (!check_mb) {<br>
<br>
-    fm = scheme_check_immediate_macro(fm, benv, rec, drec, 0, &mbval, NULL, NULL);<br>
+    fm = scheme_check_immediate_macro(fm, benv, rec, drec, 0, &mbval, NULL, NULL, 1);<br>
<br>
     /* If expansion is not the primitive `#%module-begin', add local one: */<br>
     if (!SAME_OBJ(mbval, modbeg_syntax)) {<br>
<br>
racket/src/racket/src/schpriv.h<br>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>
--- OLD/racket/src/racket/src/schpriv.h<br>
+++ NEW/racket/src/racket/src/schpriv.h<br>
@@ -2707,7 +2707,8 @@ Scheme_Object *scheme_check_immediate_macro(Scheme_Object *first,<br>
                                            int int_def_pos,<br>
                                            Scheme_Object **current_val,<br>
                                            Scheme_Comp_Env **_xenv,<br>
-                                           Scheme_Object *ctx);<br>
+                                           Scheme_Object *ctx,<br>
+                                            int keep_name);<br>
<br>
 Scheme_Object *scheme_apply_macro(Scheme_Object *name, Scheme_Env *menv,<br>
                                  Scheme_Object *f, Scheme_Object *code,<br>
</blockquote></div><br></div>