plum

#treesitter#compiler#wasm

git clone https://git.pyrossh.dev/plum

A statically typed, imperative programming language inspired by rust, python


plum-tooling/tree-sitter-plum/test/corpus/elvis.txt
ec5336f 1
================================================================================
ec5336f 2
elvis operator - unwraps Ok/Some or falls back to the right-hand value
ec5336f 3
================================================================================
ec5336f 4
ec5336f 5
fun firstOrDefault(list: List[Int], default: Int) -> Int =
ec5336f 6
  list.get(0) ?: default
ec5336f 7
ec5336f 8
--------------------------------------------------------------------------------
ec5336f 9
ec5336f 10
(source
ec5336f 11
  (fn
ec5336f 12
    (fn_identifier)
ec5336f 13
    (param
ec5336f 14
      (var_identifier)
ec5336f 15
      (type
ec5336f 16
        (type_identifier)
ec5336f 17
        (type
ec5336f 18
          (type_identifier))))
ec5336f 19
    (param
ec5336f 20
      (var_identifier)
ec5336f 21
      (type
ec5336f 22
        (type_identifier)))
ec5336f 23
    (type
ec5336f 24
      (type_identifier))
ec5336f 25
    (body
ec5336f 26
      (expression
ec5336f 27
        (elvis_expression
ec5336f 28
          (expression
ec5336f 29
            (primary_expression
ec5336f 30
              (attribute
ec5336f 31
                (primary_expression
ec5336f 32
                  (var_identifier))
ec5336f 33
                (fn_identifier)
ec5336f 34
                (fn_argument_list
ec5336f 35
                  (expression
ec5336f 36
                    (primary_expression
ec5336f 37
                      (integer)))))))
ec5336f 38
          (expression
ec5336f 39
            (primary_expression
ec5336f 40
              (var_identifier))))))))
ec5336f 41
ec5336f 42
================================================================================
ec5336f 43
elvis operator - coexists with ternary and try, all sharing `?`-prefixed tokens
ec5336f 44
================================================================================
ec5336f 45
ec5336f 46
fun classify(n: Int) -> Int =
ec5336f 47
  a = n > 0 ? n : 0
ec5336f 48
  b = n ?: 0
ec5336f 49
  c = n?
ec5336f 50
  a + b + c
ec5336f 51
ec5336f 52
--------------------------------------------------------------------------------
ec5336f 53
ec5336f 54
(source
ec5336f 55
  (fn
ec5336f 56
    name: (fn_identifier)
ec5336f 57
    params: (param
ec5336f 58
      name: (var_identifier)
ec5336f 59
      type: (type
ec5336f 60
        (type_identifier)))
ec5336f 61
    returns: (type
ec5336f 62
      (type_identifier))
ec5336f 63
    body: (body
ec5336f 64
      (assign
ec5336f 65
        (var_identifier)
ec5336f 66
        (expression
ec5336f 67
          (ternary_expression
ec5336f 68
            (expression
ec5336f 69
              (comparison_operator
ec5336f 70
                (primary_expression
ec5336f 71
                  (var_identifier))
ec5336f 72
                (primary_expression
ec5336f 73
                  (integer))))
ec5336f 74
            (expression
ec5336f 75
              (primary_expression
ec5336f 76
                (var_identifier)))
ec5336f 77
            (expression
ec5336f 78
              (primary_expression
ec5336f 79
                (integer))))))
ec5336f 80
      (assign
ec5336f 81
        (var_identifier)
ec5336f 82
        (expression
ec5336f 83
          (elvis_expression
ec5336f 84
            (expression
ec5336f 85
              (primary_expression
ec5336f 86
                (var_identifier)))
ec5336f 87
            (expression
ec5336f 88
              (primary_expression
ec5336f 89
                (integer))))))
ec5336f 90
      (assign
ec5336f 91
        (var_identifier)
ec5336f 92
        (expression
ec5336f 93
          (primary_expression
ec5336f 94
            (try_expression
ec5336f 95
              value: (primary_expression
ec5336f 96
                (var_identifier))))))
ec5336f 97
      (expression
ec5336f 98
        (primary_expression
ec5336f 99
          (binary_operator
ec5336f 100
            left: (primary_expression
ec5336f 101
              (binary_operator
ec5336f 102
                left: (primary_expression
ec5336f 103
                  (var_identifier))
ec5336f 104
                right: (primary_expression
ec5336f 105
                  (var_identifier))))
ec5336f 106
            right: (primary_expression
ec5336f 107
              (var_identifier))))))))