[cvs] / pirate / INTEROP Repository:
ViewVC logotype

View of /pirate/INTEROP

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (download) (annotate)
Sun Aug 3 14:38:52 2003 UTC (7 years, 1 month ago) by michal
Branch: MAIN
CVS Tags: HEAD
initial checkin of lua notes
# notes on language interop for pirate

# from reading K Stol's report on his 
# lua->parrot compiler (also called pirate):
#
#    http://members.home.nl/joeijoei/parrot/report.pdf
#
# dotted numbers indicate sections in his report

6.2.1 break - semantics are same as in python 
6.2.2 return - same, but he uses save for multiple
               return values whereas I treat it as a tuple
6.2.3 if/then - very very similar... what is "false" in lua/python/imcc ??
6.2.4 while - same
6.2.5 repeat - (not possible in python)
6.2.6 for - completely different; essentially while + a counter


he uses .namespace / .endnamespace for all his temp vars.
probably good practice, even with my mangled names.

6.3 assignments in lua

    lua: "as section 1.2.5 described, when a global 
    variable is accessed or assigned to, then that 
    should be handled as an event

    multiple assignments
    # good point: (need to test once indexes work)
    i=3
    i,a[i] = 4, 100 # a[i] should be a[3] 


6.4 functions
    """
    All function calls in Lua do follow the calling conventions,
    but not the returning conventions. This is because of the 
    way how Lua handles assignment statements. According to the
    calling conventions, return values should be stored into 
    registers. However, Lua functions save their return values
    onto the run-time stack. This way, another module will not
    be able to receive values returned by a Lua function.
    """

    exporting functions: function stubs? (but didn't he say
    it had first clast functions?) For python, how will people
    find  _sub0001?? Maybe just create a bunch of Subs and store
    as variables in the namespace... that's basically what python 
    does with import... (and what about if __name__ =="__main__" ?)
    

    (ah.. that's exactly what says he "should" do if not for i,a[i]=...)
    .sub _f
        P0 = global "f" # get current value of f
        invoke # invoke it
        restore P5
        restore P6
        restore P7
        ret # return to calling function
    .end
    
    Actually, since parrot is designed this way, that's
    probably how I should be doing my return values,
    and then just make the parser handle i,a[i]
    (i,a.i wouldn't have that problem - it's only for [i])

    Hmm:
        >>> def f(x):
        ...     if x: return 1
        ...     else: return 1,2,3
        ...
        >>> f(0)
        (1, 2, 3)
        >>> a = f(0)
        >>> a
        (1, 2, 3)
        >>> a,b = f(1)
        Traceback (most recent call last):
          File "<stdin>", line 1, in ?
        TypeError: unpack non-sequence
        >>> a,b,c = f(1)
        Traceback (most recent call last):
          File "<stdin>", line 1, in ?
        TypeError: unpack non-sequence
        >>> (a,b,c) = f(0)
        >>> a,b = f(0)
        Traceback (most recent call last):
          File "<stdin>", line 1, in ?
        ValueError: unpack tuple of wrong size

    Looks like we can just test register I3 (retun value count)
    and compare left and right sides if it's a function call.
    (see the calling convention docs, i guess)


    Actually, it looks like his functions DO follow the
    conventions, but the wrapper stubs do not!

    Then we should just say in x-lang development, 
    you never just jump to a label, but get it 
    out of a variable instead. (??) In other words,
    functions should always be PMC's. That ought to 
    be defined in the calling convention docs. (maybe it is??)

6.4.2 translating function defs

    yep: 
      """ 
      The translation of a function involves translating all
      statements in the function.  The function will get an
      internal name, which is automatically generated by Pi-
      rate. This is because a function in Lua does not
      really have a name.
      """ 

   but:
     """
     Because all Lua data types are implemented as pmcs, 
     it is not enough for a function to have a set of local 
     variables, one for each parameter, and then copy the actual
     parameters into those local variables. Somehow, a 
     'deeper' copy must be made. Parrot has an instruction 
     for that: clone.
     """

     why would you clone a number? (can you put a tag method 
     on "5" ??) cloning strings make sense IF strings are 
     mutable in lua (they're immutable in python). Otherwise,
     why is it needed? i don't understand this.

     """ section 5.4:
     All arguments in Lua are passed by value. This means that 
     when a function is called with some parameters, then the 
     function receives copies of those values. However, one 
     thing is very important to note: LuaTables objects are 
     stored as references. This means that when a LuaTable
     object is passed as an argument, the reference to the
     table must be copied, not the table itself.
     """ 

     In any case, this means the code generator for subs
     would have to use a template method:

     class SubroutineGenerator(CodeGenerator):
         def __init__(self, params=[], code):
             self.params = params
             self.retvals = []
             self.code = code
         def generate(self):
             self.gen_params() # .local by default, clone for lua
             self.gen_body()
             self.gen_return()
         ...

      what happens if a call by reference language and a call by
      value language try to talk to each other?

      I'm still not convinced he has to do what he's doing here.
      I don't really understand what the distinction is except
      for mutable strings. # @TODO: ask him for test case 

6.4.3 dealing with "self":
      """
      Lua has a special syntax for calling so-called methods. 
      These are functions stored in tables. This allows for 
      a kind object oriented programming (be it somewhat artificial).
      When such a function is called, the table... in which the
      function is stored, is passed as these first parameter. 
      This does not change the way parameters are passed, though.
      """

6.5 local declarations
    # i probably ought to be using store_lex too (or is that imcc .local?)
    for each name in namelist:
        store_lex -1, name, $Px
    


6.6.2 field references
    looks like in lua, a.i and a["i"] are the same.
    (but a[i] is still different)
    in python they're different
    in imcc, there's just setprop/getprop
    so xlang wouldn't quite be transparent
    @TODO: ask about on/in distinction on  p6-internals!

    in python, one will resolve to __getitem__ and one to __getattr__
    or __setitem__ and __setattr__ or __delitem__ and __delattr_,
    which also means the generator will need to know which SIDE
    of the equal sign we live on, and generate code differently
    depending.

    (lua probably does this too, given the i,a[i] thing... check the code)

6.7 tags
    """
    A tag is just a property of an entity. Each type of 
    entity has its own tag. This means, for example, 
    that all numbers in Lua have the same tag. For 
    numbers, in fact, for all types, except tables, 
    the tag cannot be changed.
    """

7.1 imcc optimizations
    strength reduction: augmented assigns should do this at the ast level

7.3 lua-pirate optimization
    lua code always has a main() function...

8.1 lua standard libraries
    do we really want a library for each language? (probably stuck with it)
    how does the parrot debugger work? can we wrap it to look like python/lua?

9.3.1 calling conventions
    apparently, .arg doesn't follow the calling conventions yet!
    (i think this is still true, considering leo's recent remarks)
    
9.3.2 exchanging data
    good points. probably need to address each of these w/python
    why is luatable troublesome if passed to perl? 
    as long as .x and [x] both work, it should be fine, right?
    (but again, imc makes no distinction between in and on)

    definitely need to talk about the pass-by-reference/value thing.

    #5 is a good test case, but I don't buy that lua and a statically
    typed language can't interact, IF, for xlang, the args are always
    PMCs (but this fits with the notion of being able to jump safely 
    into a second point in the structure)


10.3.1 "known issues"   
     "Lua has a special for statement for iterating over a table. 
      However, at this moment there is no iterator PMC available."

C1 parrot calling conventions
   "P2 holds the object the function was called on (as a method call).
    Not used in Pirate." (why not, if the table is passed in first?)



No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.5