[plt-scheme] Define-syntax and #hash - ugly compiling behavior
You mean the following?
#lang scheme
(define-syntax (my-hash stx)
(syntax-case stx ()
((_ (key . val) ...)
(let
((keys (map syntax->datum (syntax->list #'(key ...))))
(vals (map syntax->datum (syntax->list #'(val ...)))))
; make the hash-table at expansion time!
(datum->syntax #'here (make-immutable-hash (map cons keys vals)))))))
; tests:
(define h (my-hash (a . 1) (b . 2) (c . 3)))
(hash-map h list) ; --> ((a 1) (b 2) (c 3))
(hash-ref h 'a) ; 1
Best wishes, Jos.
----- Original Message -----
From: Patrick Steiger
To: plt-scheme at list.cs.brown.edu
Sent: Monday, September 14, 2009 5:39 AM
Subject: [plt-scheme] Define-syntax and #hash - ugly compiling behavior
Hello, all. This is my first post on the list, I'm a CS student and I've been giving Scheme a shot. (liking it a lot, so far).
Now, given the following code:
(define-syntax myhash
(syntax-rules (->)
[(_ (x -> y) ...)
#hash((x . y) ...)]))
When trying to compile it, I get:
. read: expected `(' or `[' or `{' to start a hash pair
I was told that this happens because the compiler recognizes #hash as a hash-table long before (in the lexical analysis?) knowing that it is inside a (define-syntax), and therefore doesn't get the semantics of '...' - it just interprets it as illegal syntax.
This seems like a major wart with the language. What are your opinions?
--
Patrick Steiger.
"Theory is when you know something, but it doesn't work. Practice is
when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't
know why." - Anon
------------------------------------------------------------------------------
_________________________________________________
For list-related administrative tasks:
http://list.cs.brown.edu/mailman/listinfo/plt-scheme
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20090914/998dc77e/attachment.html>