tricu

A lazy functional language based on Tree Calculus
Log | Files | Refs | README | LICENSE

tutorials.py (4503B)


      1 """Beginner/reference catalogue settings and independent native expectations."""
      2 def literal(value):
      3     if isinstance(value, dict): return value
      4     if isinstance(value, bool): return dict(type='bool', value=value)
      5     if isinstance(value, int): return dict(type='number', value=str(value))
      6     if isinstance(value, str): return dict(type='string', value=value)
      7     return dict(type='list', value=[literal(x) for x in value])
      8 
      9 
     10 def tree(value): return dict(type='tree', value=value)
     11 
     12 
     13 def examples():
     14     # First case is the initial expression. Other cases double as definition
     15     # presets; repeated cases exercise fallback paths without changing a preset.
     16     return {
     17         'names-values': ('Names and values', 'Basic Examples', [
     18             ('greeting', [], 'Hello, world!', 'string'), ('answer', [], 42, 'number'),
     19             ('greetAndAnswer', [], ['Hello, world!', 42], 'values')]),
     20         'arithmetic': ('Doing arithmetic', 'Basic Examples', [
     21             ('total', [], 12, 'number'), ('multiplied', [], 35, 'number'), ('grouped', [], 24, 'number')]),
     22         'functions': ('Your first function', 'Basic Examples', [
     23             ('sixDoubled', [], 12, 'number'), ('nineDoubled', [], 18, 'number'),
     24             ('double', [6], 12, 'number'), ('double', [9], 18, 'number'),
     25             ('rectangle', [4, 7], 28, 'number'), ('area', [], 28, 'number')]),
     26         'lists': ('Working with lists', 'Basic Examples', [
     27             ('itemCount', [], 3, 'number'), ('total', [], 12, 'number'), ('numbers', [], [2, 4, 6], 'values')]),
     28         'transform-list': ('Transforming a list', 'Basic Examples', [
     29             ('total', [], 24, 'number'), ('double', [5], 10, 'number'),
     30             ('numbers', [], [2, 4, 6], 'values'), ('doubled', [], [4, 8, 12], 'values')]),
     31         'choices': ('Making a choice', 'Basic Examples', [
     32             ('emptyBasket', [], 'Your basket is empty.', 'string'),
     33             ('oneItem', [], 'You have one item.', 'string'),
     34             ('fullBasket', [], 'You have several items.', 'string'),
     35             ('message', [0], 'Your basket is empty.', 'string'),
     36             ('message', [1], 'You have one item.', 'string'),
     37             ('message', [4], 'You have several items.', 'string')]),
     38         'language-reference': ('Language reference', 'Language & Runtime Explorations', [
     39             ('answer', [], 42, 'number'), ('identity', [7], 7, 'number'), ('identity', ['hello'], 'hello', 'string'),
     40             ('first', [7, 9], 7, 'number'), ('leaf', [], tree('0'), 'tricu'),
     41             ('shapes', [], [tree('0'), tree('10'), tree('200')], 'tricu'),
     42             ('literals', [], ['hello', 42, [1, 2, 3]], 'tricu'),
     43             ('addTwo', [5], 7, 'number'),
     44             ('describe', [7], 'seven', 'string'), ('describe', ['hi'], 'greeting', 'string'),
     45             ('describe', [True], 'true', 'string'), ('describe', [[4, 5]], 'two items', 'string'),
     46             ('describe', [[1, 2, 3]], 'nonempty list', 'string'), ('describe', [[]], 'empty list', 'string'),
     47             ('describe', [tree('110')], 'other', 'string'),
     48             ('keep', [tree('200')], tree('200'), 'tricu'), ('keep', [tree('10')], tree('0'), 'tricu'),
     49             ('local', [6], 12, 'number'), ('viaWhere', [6], 7, 'number'),
     50             ('copy', [[1, 2, 3]], [1, 2, 3], 'bytes'), ('copy', [[]], [], 'bytes'), ('copy', [tree('10')], [], 'bytes'),
     51             ('firstOr', [99, [5]], 5, 'number'), ('firstOr', [99, []], 99, 'number'),
     52             ('localCopy', [[4, 5]], [4, 5], 'bytes'), ('localCopy', [[]], [], 'bytes'), ('localCopy', [tree('10')], [], 'bytes'),
     53             ('checked', [42], 42, 'number'), ('sequenced', [9], 9, 'number'),
     54         ]),
     55     }
     56 
     57 
     58 def encoded(value): return value if isinstance(value, dict) else literal(value)
     59 
     60 
     61 def settings():
     62     result = {}
     63     for name, (title, category, cases) in examples().items():
     64         presets = {}
     65         for export, arguments, _, output in cases:
     66             presets.setdefault(export, dict(arguments=[encoded(a) for a in arguments], output=output, mode='pure'))
     67         first = cases[0]
     68         result[name] = dict(title=title, category=category, exports=list(presets), export=first[0],
     69                             args=presets[first[0]]['arguments'], output=first[3], mode='pure', presets=presets)
     70     return result
     71 
     72 
     73 def cases():
     74     return {name: [(export, [encoded(a) for a in arguments], encoded(expected))
     75                    for export, arguments, expected, _ in rows]
     76             for name, (_, _, rows) in examples().items()}