[video member=pervognsen stream_platform=twitch project=bitwise title="Domain-Specific Languages In Python" vod_platform=youtube id=4gJOiQbhWWM annotator=Miblo] [0:09][Recap and set the stage for the day][:speech] [0:34][Review some off-stream :optimisation on the lowered jump table-based switch statement][:asm :language :speech] [5:30][Being careful of associativity when flattening expressions and register allocations, with another mention of the Sethi–Ullman algorithm[ref site=Wikipedia page="Sethi–Ullman algorithm" url=https://en.wikipedia.org/wiki/Sethi%E2%80%93Ullman_algorithm]][:asm :language :speech] [12:00][Setup to cover domain-specific languages in Python][:language :speech] [15:46][Dive into building up an abstract syntax tree for our logic design code, starting by :parsing the & operator][:"data structure" :language] [20:42][:Run it to find that it does execute][:language] [21:11][Parse the | operator and introduce UnaryNode][:language :parsing] [24:02][Note why __not__ doesn't exist in Python][:language :speech] [25:11][Guard against erroneous boolean comparison of variables][:parsing] [25:54][:Run it to see our intended error] [27:50][Fix the \~ Node to use __invert__ (rather than __inv__)][:parsing] [28:13][Note that we're building up a graph rather than a tree][:parsing :speech] [30:43][Introduce the notion of a ConstantNode, and as_node()][:language :parsing] [34:30][A few words on Python's reverse operator overload methods][:language :speech] [38:18][Rename InputNode to VariableNode and input() to var()][:language :parsing] [39:16][Consider how to handle out-of-range errors for bitwise-not in Python][:language :parsing :speech] [44:12][Enable as_node() to handle out-of-range errors on ints by taking their least significant bit][:language] [45:05][@elavid][I guess "1 & x" tries to run the int class __and__ function first, and when that throws some exception it tries Per's __rand__ function instead][:language] [47:27][Determine to create a simple interpreter][:language :parsing :speech] [49:09][Embark on a simple interpreter, introducing evaluate() and related functions][:language :parsing] [57:02][Test evaluate() to see that it all works as expected][:language :parsing :run] [1:01:28][Construct a nested tree 16 levels deep for evaluate() to evaluate][:language] [1:06:33][:Run it to see that the :performance of our evaluate() is terrible, on 16 and 32 levels deep][:language :parsing] [1:07:47][Introduce eval() to cache values for evaluate() to call][:language] [1:12:15][:Run it to see that the state does get filled in][:language] [1:12:41][Increase our nested tree to 32 levels deep][:language] [1:13:19][:Run it to see that it is now instantaneous][:performance] [1:14:51][Reflect on our Python-based interpreter][:speech] [1:15:37][Q&A][:speech] [1:15:47][@rickylqhan][What's your endgame?] [1:17:11][@garryjohanson][@pervognsen So this is off-topic, but do you think the Intel 8086 chip will be within the direct scope of this project, or is it more complicated than what we are attempting?] [1:18:17][That's it for today][:speech] [/video]