New Directives Design in Wipple
January 5, 2021
Wipple has evolved a lot since my last post! I plan to publish a full writeup of all updates to the language, but for now, I've added a new construct called a directive.
Directives are special constructs that apply to the statement level and operate in three modes:
-
Stack mode (stack is reset at end of statement)
[stack push key value] -- Push a key-value pair to the stack, overwriting if the key already exists [stack pop key] -- Pop the key-value pair from the stack [stack get key] -- Get the key-value pair from the stack [stack has key] -- Check if the key exists in the stack
-
Environment mode
[env set key value] -- Set the key-value pair on the environment [env get key] -- Get the key-value pair from the environment [env has key] -- Check if the key exists in the environment [env del key] -- Remove the key-value pair from the environment if it exists [env export key replace/merge/error] -- Set the export mode for a key: 'replace' replaces the value, 'merge' uses the Merge trait, 'error' crashes the program
-
Global mode
[global set key value] -- Set the key-value pair globally [global get key] -- Get the key-value pair globally [global has key] -- Check if the key exists globally [global del key] -- Remove the key-value pair globally if it exists
You can create an env/global-level alias for pushing a value to the stack using the following syntax:
[env/global alias foo] -- push a value to the stack, accessible as [foo <value>]
For example, you can create a convenient syntax for adding documentation to a variable (inspired by Rust):
[env alias doc] () -- equivalent to [stack push doc "..."] [doc "The ratio of a circle's circumference to its diameter"] pi : 3.14
The early design of directives also managed assignment (implementing :
). To define a variable in the current environment, use the macro :
, which is implemented as:
do { foo : 42 foo -- 42 } foo -- error
To define a variable globally, use global:
(you should rarely need to do this):
do { foo global: 42 foo -- 42 } foo -- 42
Similarly, you can use ::=
for environment-level conformances and global::=
for global conformances.
More updates coming soon!