Documentation literals

Documentation blocks have typeDoc- documentation is a first-class value in the language.{{starts a documentation block and}}finishes it. For example:

addingAndRemoving : Doc
addingAndRemoving =
  use List +: :+ insert
  {{
  # Adding, removing, and replacing elements of lists
  
    {+:} adds an element to the front of a list:
    
    ```
    1 +: [2, 3, 4]
    ```
    
    {:+} adds an element to the end of a list:
    
    ```
    [1, 2, 3] :+ 4
    ```
    
    {insert} inserts an element at any point in a list:
    
    ```
    insert 1 "green" ["red", "blue"]
    ```
    
    {intersperse} inserts an element between all the elements of a
    list:
    
    ```
    intersperse 0 [1, 2, 3]
    ```
    
    {deleteAt} removes a specific element from a list:
    
    ```
    deleteAt 2 [5, 3, 8, 9]
    ```
    
    {replace} replaces a specific element with another one:
    
    ```
    replace 1 "cheese" ["flour", "butter", "eggs"]
    ```
  }}

More specifically, some important Doc features are:

  • Links to definitions are done with single open and close braces.{List.drop}is a term link, and{type List}is a type link.
  • @signature{List.take}or@inlineSignature{List.take}expands to the type signature of List.take either as a block or inline, respectively.
  • @source{List.map}expands to the full source of List.map
  • To insert another Doc value into another Doc, use nested double braces.{{I am a doc {{thisDocValueWillBeDisplayed}} }}
  • @eval{someDefinition}expands to the result of evaluatingsomeDefinition,which must be a pre-existing definition in the codebase (it can't be an arbitrary expression). You can evaluate multi-line codeblocks with the triple backtick syntax``` multipleLines ```