tricu

An interpreted language for exploring Tree Calculus
Log | Files | Refs | README | LICENSE

tutorials.py (4056B)


      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         'arithmetic': ('Doing arithmetic', 'Basic Examples', [
     20             ('total', [], 12, 'number'), ('product', [], 35, 'number'), ('grouped', [], 24, 'number')]),
     21         'functions': ('Your first function', 'Basic Examples', [
     22             ('double', [6], 12, 'number'), ('double', [9], 18, 'number'), ('add', [4, 7], 11, 'number')]),
     23         'lists': ('Working with lists', 'Basic Examples', [
     24             ('count', [], 3, 'number'), ('total', [], 12, 'number')]),
     25         'transform-list': ('Transforming a list', 'Basic Examples', [
     26             ('total', [], 24, 'number'), ('double', [5], 10, 'number')]),
     27         'choices': ('Making a choice', 'Basic Examples', [
     28             ('message', [0], 'Your basket is empty.', 'string'),
     29             ('message', [1], 'You have one item.', 'string'),
     30             ('message', [4], 'You have several items.', 'string')]),
     31         'language-reference': ('Language reference', 'Language & Runtime Explorations', [
     32             ('answer', [], 42, 'number'), ('identity', [7], 7, 'number'), ('identity', ['hello'], 'hello', 'string'),
     33             ('first', [7, 9], 7, 'number'), ('leaf', [], tree('0'), 'tricu'),
     34             ('shapes', [], [tree('0'), tree('10'), tree('200')], 'tricu'),
     35             ('literals', [], ['hello', 42, [1, 2, 3]], 'tricu'),
     36             ('addTwo', [5], 7, 'number'),
     37             ('describe', [7], 'seven', 'string'), ('describe', ['hi'], 'greeting', 'string'),
     38             ('describe', [True], 'true', 'string'), ('describe', [[4, 5]], 'two items', 'string'),
     39             ('describe', [[1, 2, 3]], 'nonempty list', 'string'), ('describe', [[]], 'empty list', 'string'),
     40             ('describe', [tree('110')], 'other', 'string'),
     41             ('keep', [tree('200')], tree('200'), 'tricu'), ('keep', [tree('10')], tree('0'), 'tricu'),
     42             ('local', [6], 12, 'number'), ('viaWhere', [6], 7, 'number'),
     43             ('copy', [[1, 2, 3]], [1, 2, 3], 'bytes'), ('copy', [[]], [], 'bytes'), ('copy', [tree('10')], [], 'bytes'),
     44             ('firstOr', [99, [5]], 5, 'number'), ('firstOr', [99, []], 99, 'number'),
     45             ('localCopy', [[4, 5]], [4, 5], 'bytes'), ('localCopy', [[]], [], 'bytes'), ('localCopy', [tree('10')], [], 'bytes'),
     46             ('checked', [42], 42, 'number'), ('sequenced', [9], 9, 'number'),
     47         ]),
     48     }
     49 
     50 
     51 def encoded(value): return value if isinstance(value, dict) else literal(value)
     52 
     53 
     54 def settings():
     55     result = {}
     56     for name, (title, category, cases) in examples().items():
     57         presets = {}
     58         for export, arguments, _, output in cases:
     59             presets.setdefault(export, dict(arguments=[encoded(a) for a in arguments], output=output, mode='pure'))
     60         first = cases[0]
     61         result[name] = dict(title=title, category=category, exports=list(presets), export=first[0],
     62                             args=presets[first[0]]['arguments'], output=first[3], mode='pure', presets=presets)
     63     # Private list values keep the beginner definition picker on scalar results.
     64     return result
     65 
     66 
     67 def cases():
     68     return {name: [(export, [encoded(a) for a in arguments], encoded(expected))
     69                    for export, arguments, expected, _ in rows]
     70             for name, (_, _, rows) in examples().items()}