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()}