This is the mail archive of the guile@cygnus.com mailing list for the guile project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: TCL->Scheme



ian@bickiia.earlhall.earlham.edu writes:
> I've been working on a TCL to Scheme translator, and I have a few
> questions to throw out there.
> 

I'm glad someone is working on this. Are you doing this specifically
for Guile, or trying to be portable to any RnRS Scheme?

> Is there anyone else actively working on translating languages to
> Scheme?
> 

Someone fixed up the translator code from the lang package a while
back, I do not know if this has percolated into the CVS version yet.

> I've heard references to being able to use gdb to debug Scheme/Guile
> source.  Is this true?  Can someone point me to how I can do this?
> 

There were Gdb patches available, as Jim mentioned a while ago, but I
am not sure they are up to date.

> I'm trying to figure out how to integrate TCL and Scheme code -- in
> some ways it seems hopeless.  However, that aside, maybe there's some
> ways to do some of these things:
> 
> How can I convert a string to a variable.  E.g., if the TCL tries to
> call a variable "*some-variable*" how can I use that string to get the 
> value of *some-variable?
> 

Approaches with varying degrees of cleverness/guile-specificity:

;; insert this code:
(eval (string->symbol "*some-variable*"))
;; however, this won't respect the local lexical scope.

(defmacro access-string-variable (var-string-name)
	(symbol->string var-string-name))

;; then insert in generated code:
(access-string-variable "*some-variable*)
;; however, this expands at macro-expansion time, not runtime, which
;; is a shortcoming for some cases in Tcl.


I'm sure there's got to be a way to do the version that can turn the string into a symbol

> How can I define a variable based on a string?  E.g., if the TCL
> wishes to export some procedure, how can I put that procedure's name
> in the global namespace?

Use the same hacks as above in combination with `define'.

> 
> Can anyone see possible solutions to the type problem -- i.e., that
> TCL has only one type (strings)?  I think this will be a general
> problem for translated languages, because the type system of one
> language won't translate one-to-one to the type system of Scheme.  If
> it is staticly typed you can munge your way around this, but most
> scripting languages aren't statically typed.
> 
> The specific problem is that if a TCL program tries to call a Scheme
> program, how will it pass its arguments?  
> 
> A TCL string can be a list:
> "1 2 {3 4}" -> '(1 2 "3 4"), or maybe '(1 2 (3 4))
> 
> A number:
> "432.4e4"
> 
> A channelId (a port):
> "file3"
> 
> A block:
> "{puts hello ; puts world}"
> 
> A variable reference:
> "x" as in "set x YYY"
> 
> And, of course, a string.  There's probably a number of other things
> it can be as well, all depending on the context.  Even if some of
> these data types are not stored internally as strings, they are still
> essentially strings.  For instance this:
> 
> string compare [list member1 member2] "member1 member2"
> 
> Must be true (and all the more subtle ways of expressing the same
> thing).
> 
> One possiblity, of course, is to make any callouts by the TCL program
> use special type-identifiers.  For instance:
> 
> scheme:append [scheme:list "member1" "member2"] [scheme:list "member3"]
> 
> It would be nice is there was something cleaner, though.  Maybe there
> isn't.
> 

I don't think there is a better way. Note that you also need to
specify the return type unless it is possible to magically convert to
strings in a canonical way.

> 
> So, those are my questions.  Hopefully you all can help me out.  
> 
> So far the translation seems like it's going fairly well -- I'm using
> a TCL interpreter written in Scheme, then applying a partial evaluator
> (Similix
> http://www.diku.dk/research-groups/topps/activities/similix.html).  I
> don't think there's really any other reasonable way to translate TCL,
> it being so context sensitive. 

I don't know if this will precisely reproduce semantics. There is
actually real Tcl code out there that depends on accessing a variable
through a name determined by accessing another variable (though I can
no longer remember the hairy syntax for this).

> (I don't know how they byte-compile
> TCL -- the language seems practically designed to make it hard to
> compile by convential means).

Tell me about it.

 - Maciej Stachowiak