Documentation literals

Documentation blocks have type Doc - 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 evaluating someDefinition, 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 ```