Paste number 21936: Smalltalk-style syntax patch

Paste number 21936: Smalltalk-style syntax patch
Pasted by: Arnia
2 years, 6 months ago
#swhack
Paste contents:
Raw Source | XML | Display As
Only in pluvo-smalltalk: .DS_Store
diff -ur -x '*.pyc' -x '*.pvo' pluvo-latest/basics.py pluvo-smalltalk/basics.py
--- pluvo-latest/basics.py        2006-06-06 13:41:20.000000000 +0100
+++ pluvo-smalltalk/basics.py        2006-07-02 02:27:14.000000000 +0100
@@ -73,7 +73,7 @@
       else: block = value
 
       if weakFunction(block):
-         env.evaluate(block)
+         return env.evaluate(block)
    else: return var[attrname]
 
 def elsethen(env, block):
@@ -123,6 +123,58 @@
          py, object = args
          env.bind(var.name, object, condition=py)
    else: raise ValueError("Must have one or two args")
+   
+def exclaim(env, *args):
+   # ! param1: var1 param2: var2 block
+   if len(args) < 2: raise ValueError("Action must have at least one symbol and a block")
+   
+   
+   # If we only have one symbol, we're a predicate without parameter
+   if len(args) == 2:
+      predsym = args[0]
+      block = args[1]
+      method(env, predsym, Symbol("="), Table(), block)
+      
+   else:
+      block = args[-1] # Block is penultimate argument
+      argspec = Table()
+      symname = ""
+      for i in xrange(len(args[:-1])):
+         if not i%2:
+           name = args[i].name
+           symname = symname + name
+         else:
+           var = args[i]
+           argspec.append(var)
+      actsym = Symbol(symname)
+
+      method(env, actsym, Symbol("="), argspec, block)
+      
+def ask(env, var, *args):
+   # ask obj param1: arg1 param2: arg2
+   if not len(args) > 0: raise ValueError("Must ask an object to do something")
+   
+   # Predicate execution
+   if len(args) == 1:
+      return dot(env, var, args[0])
+      
+   #print var
+      
+   # Compile message name and arguments
+   argspec = Table()
+   symname = ""
+   for i in xrange(len(args)):
+      if not i%2:
+        name = args[i].name
+        symname = symname + name
+      else:
+        arg = args[i]
+        argspec.append(arg)
+   actsym = Symbol(symname)
+   #print actsym
+   finalargs = [a for a in argspec]
+   dot(env, var, actsym, *finalargs)
+   #return env.evaluate(block, argspec)
 
 def example(env, block):
    pass
@@ -358,10 +410,12 @@
    "**": power,
    "<": lessthan,
    ">": morethan,
-   ".": dot,
+   ".": dot,
+   "!": exclaim,
    "|": pipe,
    "add": add, # @@ push?
    "args": Table(sys.argv[2:]),
+   "ask": ask,
    "check": check,
    "def": equals,
    "else": elsethen,
@@ -382,6 +436,7 @@
    "say": say,
    "script": script,
    "split": split,
+   "to": ask,
    "usage": usage
 })
 
diff -ur -x '*.pyc' -x '*.pvo' pluvo-latest/datatypes/table.py pluvo-smalltalk/datatypes/table.py
--- pluvo-latest/datatypes/table.py        2006-06-01 13:16:46.000000000 +0100
+++ pluvo-smalltalk/datatypes/table.py        2006-07-02 00:49:10.000000000 +0100
@@ -160,6 +160,7 @@
             self[i + length] = obj
          for (i, obj) in enumerate(item):
             self[i + key.start] = obj
+      
 
    def __delitem__(self, key):
       if isinstance(key, int):
diff -ur -x '*.pyc' -x '*.pvo' pluvo-latest/parser.py pluvo-smalltalk/parser.py
--- pluvo-latest/parser.py        2006-06-01 14:31:55.000000000 +0100
+++ pluvo-smalltalk/parser.py        2006-07-02 01:47:17.000000000 +0100
@@ -14,7 +14,7 @@
    ('URI', r'<[^ \t\r\n"<>]+>'),
    ('Documentation', r'%% [^\n]+(?=\n)|% (?:[^\n]+|\n(?!\n))*\n'),
    ('Comment', r'#[^\n]*'),
-   ('Variable', r'[$@%]?[A-Za-z]+'),
+   ('Variable', r'[$@%]?[A-Za-z]+[:\?]?'),
    ('Flag', r'--?[A-Za-z][A-Za-z0-9]*'),
    ('Number', r'-?(?:[1-9][0-9]*)?[0-9](?:\.[0-9]+)?'),
    ('Indent', r'\n  +'),
@@ -25,8 +25,9 @@
    ('CloseParen', r'\)'),
    ('OpenBrace', r'\{'),
    ('CloseBrace', r'\}'),
-   ('Equals', r'='),
-   ('Colon', r':'),
+   ('Equals', r'='),
+   ('Exclaim', r'\!'),
+   ('Colon', r':'),
    ('Plus', r'\+'),
    ('Minus', r'-'),
    ('Star', r'\*'),
@@ -43,7 +44,7 @@
 CommandClosers = set(['CloseBrace', 'Newline', 'SemiColon'])
 
 Operators = set([
-   'CloseTriangular', 'Colon', 'DoubleArrow', 'DoubleEquals', 'DoubleStar',
+   'CloseTriangular', 'Colon','Exclaim', 'DoubleArrow', 'DoubleEquals', 'DoubleStar',
    'Equals', 'FullStop', 'Minus', 'OpenTriangular', 'Pipe',
    'Plus', 'Slash', 'Star'
 ])

This paste has no annotations.

Colorize as:
Show Line Numbers

Lisppaste pastes can be made by anyone at any time. Imagine a fearsomely comprehensive disclaimer of liability. Now fear, comprehensively.