Hi Jens,

I like the idea of using an object that dispatches on number of arguments instead of requiring explicit function names, something I'm embarrassed to say I hadn't thought of, so I'm grateful for being shown this technique.

I shall go about experimenting with a shorter solution. I'll be using a less "only people that know everything about Racket" object however ;) shown here:

(define (level ss)
  (define h (hash-copy (for*/hash ([(s i) (in-indexed ss)]
                                   [(x j) (in-indexed s)])
                         (values (list i j) x))))
  (case-lambda
    [(p) (hash-ref h p)]
    [(p x) (hash-set! h p x) x]
    [else (error "level: too many arguments")]))

I didn't even know structures could be procedure-ified.

On 06/11/2013 05:06 AM, Jens Axel Søgaard wrote:
Hi Sean

2013/6/10 Sean Kanaley <skana...@gmail.com>

Also, for some reason Racket doesn't return values from mutations.  Why on 
earth (set! x 3) is void instead of 3 is a mystery, but it leads to things like:

(define-match (x ...) (heap-min heap))
(now-remove-it!)

and, in addition to verbose naming:

(vector-set! v i 4)
v

which should ideally be:

(vec! v i 3)

Here is an alternative representation of levels using that allows you to
write (l p) to get the value of position p in level l. Also (l p x) sets the
character at position p in level l to x.

#lang racket
(struct level (h get/set)
   #:property prop:procedure (struct-field-index get/set))

(define (make-level strings)
   (define h (hash-copy
              (for*/hash ([(row i) (in-indexed strings)]
                          [(x j)   (in-indexed row)])
                (values (list i j) x))))
   (define (get p) (hash-ref h p))
   (define (set p x) (hash-set! h p x) x)
   (define get/set (case-lambda [(p) (get p)] [(p x) (set p x)]))
   (level h get/set))

(define l (make-level (list "########"
                             "#      #"
                             "#  . @ #"
                             "########")))

(l '(0 0))
(l '(0 0) #\.)
(l '(0 0))

  --
Jens Axel Søgaard

____________________
 Racket Users list:
 http://lists.racket-lang.org/users

Reply via email to