Rüdiger, if you want to encode FSMs, you don't want to worry about in-lining 
constants. You want a macro that helps you write down the ENTIRE FSM and then 
compiles to small, efficient code. Think back to your Formal Languages course. 
A regexp is some alphabet Sigma, States, Initial States, Final States, 
Transition table. So you might wish to start with 

(define-syntax (define-fsm stx)
  (syntax/parse stx 
    [(_ Alphabet States Initial Final Transitions) …]))

I am pretty sure that the question of in-lining constants won't even come up. 
It'll just happen. 

In general, I urge you to not to translate C ideas into Racket. Think bigger. 

[[Many years ago I had to rewrite a large chunk of code that a 
then-undergraduate/now-famous-professor had constructed as infrastructure for 
some AI course. The code had literally been translated from C to Scheme, with 
ref cells playing the role of pointers. Some functions looked like this 

 ;; [Box Integer] -> Void 
 (define (f result) .. .. (set-box! result e) (void)) 

Students soon complained that the Scheme code was an order of magnitude slower 
than the C code. With a day's worth of work, I rewrote it into a much more 
functional style and cut its run time in half and less. Then I started worrying 
about where the cost went in a Scheme program. It really makes no sense to copy 
C idioms in Scheme or Lisp or Racket. Compilers aren't built that way.]]

-- Matthias





On Mar 9, 2012, at 6:25 AM, Rüdiger Asche wrote:

> Hi there,
> 
> #1: My graduate thesis (in 1988) was an implementation of Scheme. I do feel 
> reasonably comfortable with tail recursion, continuations, closures and the 
> "basics," even the basic notion of hygienic macros (which Eugene Kohlbecker 
> had just finished his doctorate on when I studied Scheme at IU). There are a 
> number of things that have drastically evolved since then, though. I have 
> taken up Racket again in February (see #2).
> 
> #2: I'm indeed in Embedded where every byte and every cycle counts, and since 
> my pet project is to eventually run Scheme code on Embedded Controllers, 
> implementation details ARE an issue - even on 32 bit machines some of which 
> have to make do with as little as 256k Flash and 64k RAM. It's the luxury of 
> academics to deal with the big picture; it's my job to get things to work out 
> there in the world - it's as simple as that ;-)
> 
> The trigger for my question was an fsm I am working on now, along the lines of
> 
> (define (vendingmachine currentstate)
>  (let ((newstate
>     (case currentstate
>         [(VENDINGMACHINE_IDLE)
>              (if (CoinInserted)
>                  VENDINGMACHINE_INSERTED_COIN
>                  VENDINGMACHINE_IDLE
>              )
>         ]
>         [(VENDINGMACHINE_INSERTED_COIN)
>              ...
>         ]
>         [
>         ]
>         [
>         ]
>         [
>         ]
>     )
>    (vendingmachine newstate)  ; make sure this remains in tail recursive 
> position
>  )
> )
> 
> ...
> 
> (vendingmachine VENDINGMACHINE_IDLE)
> 
> where every of the VENDINGMACHINE_xxx identifiers is very simply a readable 
> symbolic identifier for a disjoint constant. I have a hard time believing 
> that in reasonably complex fsms, it shouldn't impose a severe performance 
> penalty to look up a constant every time it is used?
> 
> Not Thomas' remark about "defines being inlined most of the time" sounded 
> interesting. Is it really like that? Under what circumstances, and can I 
> control that behavior?
> 
> Thanks again!
> 
> 
> Quoting Neil Van Dyke <n...@neilvandyke.org>:
> 
>> First of all, sounds like you have a substandard C compiler, and that
>> you must be targeting a 4-bit microcontroller. :)
>> 
>> Regarding these micro-optimizations in Racket: if you are fairly new to
>> Racket (I don't know), my suggestion is to avoid trying to optimize
>> every word of allocation and every variable reference overhead, and
>> instead focus on learning the idiomatic language.  I suggest pretending
>> that variable references are negligible for now, and instead focus on
>> things like trying to make tail calls, and trying to avoid variable
>> mutations.
>> 
>> -- 
>> http://www.neilvandyke.org/
> 
> 
> 
> 
> ____________________
> Racket Users list:
> http://lists.racket-lang.org/users


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

Reply via email to