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/function.txt
4bd2c1c 1
================================================================================
f997bee 2
function - no return
4bd2c1c 3
================================================================================
4bd2c1c 4
c06ddba 5
fun sum(a: Int, b: Int) =
f997bee 6
  todo
4bd2c1c 7
efe15db 8
--------------------------------------------------------------------------------
4bd2c1c 9
efe15db 10
(source
efe15db 11
  (fn
f997bee 12
    (fn_identifier)
efe15db 13
    (param
9e7927c 14
      (var_identifier)
efe15db 15
      (type
f997bee 16
        (type_identifier)))
efe15db 17
    (param
9e7927c 18
      (var_identifier)
efe15db 19
      (type
f997bee 20
        (type_identifier)))
f997bee 21
    (body
f997bee 22
      (todo))))
4bd2c1c 23
efe15db 24
================================================================================
f997bee 25
function - return
efe15db 26
================================================================================
4bd2c1c 27
c06ddba 28
fun sum(a: Int, b: Int) -> Int =
f997bee 29
  todo
4bd2c1c 30
4bd2c1c 31
--------------------------------------------------------------------------------
4bd2c1c 32
4bd2c1c 33
(source
4bd2c1c 34
  (fn
f997bee 35
    (fn_identifier)
4bd2c1c 36
    (param
9e7927c 37
      (var_identifier)
4bd2c1c 38
      (type
f997bee 39
        (type_identifier)))
4bd2c1c 40
    (param
9e7927c 41
      (var_identifier)
4bd2c1c 42
      (type
f997bee 43
        (type_identifier)))
8f91d27 44
    (type
f997bee 45
      (type_identifier))
f997bee 46
    (body
f997bee 47
      (todo))))
efe15db 48
efe15db 49
================================================================================
f997bee 50
function - default value
efe15db 51
================================================================================
efe15db 52
c06ddba 53
fun random(a: Int = 10) =
f997bee 54
  todo
efe15db 55
efe15db 56
--------------------------------------------------------------------------------
efe15db 57
efe15db 58
(source
4bd2c1c 59
  (fn
f997bee 60
    (fn_identifier)
4bd2c1c 61
    (param
9e7927c 62
      (var_identifier)
4bd2c1c 63
      (type
f997bee 64
        (type_identifier))
efe15db 65
      (expression
efe15db 66
        (primary_expression
efe15db 67
          (integer))))
f997bee 68
    (body
f997bee 69
      (todo))))
efe15db 70
efe15db 71
================================================================================
f997bee 72
function - generics
efe15db 73
================================================================================
efe15db 74
c06ddba 75
fun add(param: T, param2: List[U]) -> List[U] =
f997bee 76
  todo
efe15db 77
efe15db 78
--------------------------------------------------------------------------------
efe15db 79
efe15db 80
(source
4bd2c1c 81
  (fn
f997bee 82
    (fn_identifier)
f997bee 83
    (param
9e7927c 84
      (var_identifier)
f997bee 85
      (type
8f91d27 86
        (generic)))
4bd2c1c 87
    (param
9e7927c 88
      (var_identifier)
4bd2c1c 89
      (type
f997bee 90
        (type_identifier)
f997bee 91
        (type
8f91d27 92
          (generic))))
8f91d27 93
    (type
f997bee 94
      (type_identifier)
8f91d27 95
      (type
8f91d27 96
        (generic)))
f997bee 97
    (body
f997bee 98
      (todo))))
efe15db 99
efe15db 100
================================================================================
6b5d9db 101
function - bare self param (top-level, not a method receiver annotation)
efe15db 102
================================================================================
efe15db 103
6b5d9db 104
fun remove(self, v: T) =
f997bee 105
  todo
efe15db 106
efe15db 107
--------------------------------------------------------------------------------
efe15db 108
efe15db 109
(source
4bd2c1c 110
  (fn
9e7927c 111
    (fn_identifier)
141de54 112
    (self)
141de54 113
    (param
141de54 114
      (var_identifier)
141de54 115
      (type
8f91d27 116
        (generic)))
141de54 117
    (body
141de54 118
      (todo))))
141de54 119
96ec67f 120
================================================================================
96ec67f 121
function - variant construction call (positional args on a capitalized name)
96ec67f 122
================================================================================
96ec67f 123
c06ddba 124
fun makeSome(v: Int) -> Option =
96ec67f 125
  Some(v)
96ec67f 126
96ec67f 127
--------------------------------------------------------------------------------
96ec67f 128
96ec67f 129
(source
96ec67f 130
  (fn
96ec67f 131
    (fn_identifier)
96ec67f 132
    (param
96ec67f 133
      (var_identifier)
96ec67f 134
      (type
96ec67f 135
        (type_identifier)))
8f91d27 136
    (type
96ec67f 137
      (type_identifier))
96ec67f 138
    (body
aeaba6f 139
      (expression
aeaba6f 140
        (primary_expression
aeaba6f 141
          (fn_call
aeaba6f 142
            (type_identifier)
aeaba6f 143
            (fn_argument_list
aeaba6f 144
              (expression
aeaba6f 145
                (primary_expression
aeaba6f 146
                  (var_identifier))))))))))
aeaba6f 147
aeaba6f 148
================================================================================
aeaba6f 149
function - bare comparison as body's trailing statement
aeaba6f 150
================================================================================
aeaba6f 151
c06ddba 152
fun isNone(o: Option) -> Bool =
aeaba6f 153
  o == None
aeaba6f 154
aeaba6f 155
--------------------------------------------------------------------------------
aeaba6f 156
aeaba6f 157
(source
aeaba6f 158
  (fn
aeaba6f 159
    (fn_identifier)
aeaba6f 160
    (param
aeaba6f 161
      (var_identifier)
aeaba6f 162
      (type
aeaba6f 163
        (type_identifier)))
8f91d27 164
    (type
aeaba6f 165
      (type_identifier))
aeaba6f 166
    (body
aeaba6f 167
      (expression
aeaba6f 168
        (comparison_operator
aeaba6f 169
          (primary_expression
aeaba6f 170
            (var_identifier))
aeaba6f 171
          (primary_expression
aeaba6f 172
            (type_identifier)))))))
aeaba6f 173
aeaba6f 174
================================================================================
aeaba6f 175
function - bare boolean-operator as body's trailing statement
aeaba6f 176
================================================================================
aeaba6f 177
c06ddba 178
fun bothTrue(a: Bool, b: Bool) -> Bool =
aeaba6f 179
  a && b
aeaba6f 180
aeaba6f 181
--------------------------------------------------------------------------------
aeaba6f 182
aeaba6f 183
(source
aeaba6f 184
  (fn
aeaba6f 185
    (fn_identifier)
aeaba6f 186
    (param
aeaba6f 187
      (var_identifier)
aeaba6f 188
      (type
aeaba6f 189
        (type_identifier)))
aeaba6f 190
    (param
aeaba6f 191
      (var_identifier)
aeaba6f 192
      (type
aeaba6f 193
        (type_identifier)))
8f91d27 194
    (type
aeaba6f 195
      (type_identifier))
aeaba6f 196
    (body
aeaba6f 197
      (expression
aeaba6f 198
        (boolean_operator
aeaba6f 199
          (expression
aeaba6f 200
            (primary_expression
aeaba6f 201
              (var_identifier)))
aeaba6f 202
          (expression
aeaba6f 203
            (primary_expression
aeaba6f 204
              (var_identifier))))))))
aeaba6f 205
aeaba6f 206
================================================================================
aeaba6f 207
function - bare ternary as body's trailing statement
aeaba6f 208
================================================================================
aeaba6f 209
c06ddba 210
fun pick(cond: Bool, a: Int, b: Int) -> Int =
aeaba6f 211
  cond ? a : b
aeaba6f 212
aeaba6f 213
--------------------------------------------------------------------------------
aeaba6f 214
aeaba6f 215
(source
aeaba6f 216
  (fn
aeaba6f 217
    (fn_identifier)
aeaba6f 218
    (param
aeaba6f 219
      (var_identifier)
aeaba6f 220
      (type
aeaba6f 221
        (type_identifier)))
aeaba6f 222
    (param
aeaba6f 223
      (var_identifier)
aeaba6f 224
      (type
aeaba6f 225
        (type_identifier)))
aeaba6f 226
    (param
aeaba6f 227
      (var_identifier)
aeaba6f 228
      (type
aeaba6f 229
        (type_identifier)))
8f91d27 230
    (type
aeaba6f 231
      (type_identifier))
aeaba6f 232
    (body
aeaba6f 233
      (expression
aeaba6f 234
        (ternary_expression
aeaba6f 235
          (expression
aeaba6f 236
            (primary_expression
aeaba6f 237
              (var_identifier)))
aeaba6f 238
          (expression
aeaba6f 239
            (primary_expression
aeaba6f 240
              (var_identifier)))
aeaba6f 241
          (expression
aeaba6f 242
            (primary_expression
aeaba6f 243
              (var_identifier))))))))
906b92e 244
906b92e 245
================================================================================
906b92e 246
function - closure literal in expression position
906b92e 247
================================================================================
906b92e 248
c06ddba 249
fun useClosure() -> Bool =
906b92e 250
  cb = |v|
906b92e 251
    True
906b92e 252
  cb(5)
906b92e 253
906b92e 254
--------------------------------------------------------------------------------
906b92e 255
906b92e 256
(source
906b92e 257
  (fn
906b92e 258
    (fn_identifier)
8f91d27 259
    (type
906b92e 260
      (type_identifier))
906b92e 261
    (body
906b92e 262
      (assign
906b92e 263
        (var_identifier)
906b92e 264
        (expression
906b92e 265
          (closure
906b92e 266
            (var_identifier)
906b92e 267
            (body
906b92e 268
              (expression
906b92e 269
                (primary_expression
906b92e 270
                  (type_identifier)))))))
906b92e 271
      (expression
906b92e 272
        (primary_expression
906b92e 273
          (fn_call
906b92e 274
            (var_identifier)
906b92e 275
            (fn_argument_list
906b92e 276
              (expression
906b92e 277
                (primary_expression
906b92e 278
                  (integer))))))))))
906b92e 279
906b92e 280
================================================================================
906b92e 281
function - closure literal with no params
906b92e 282
================================================================================
906b92e 283
c06ddba 284
fun useClosure() -> Bool =
906b92e 285
  cb = ||
906b92e 286
    True
906b92e 287
  cb()
906b92e 288
906b92e 289
--------------------------------------------------------------------------------
906b92e 290
906b92e 291
(source
906b92e 292
  (fn
906b92e 293
    (fn_identifier)
8f91d27 294
    (type
906b92e 295
      (type_identifier))
906b92e 296
    (body
906b92e 297
      (assign
906b92e 298
        (var_identifier)
906b92e 299
        (expression
906b92e 300
          (closure
906b92e 301
            (body
906b92e 302
              (expression
906b92e 303
                (primary_expression
906b92e 304
                  (type_identifier)))))))
906b92e 305
      (expression
906b92e 306
        (primary_expression
906b92e 307
          (fn_call
906b92e 308
            (var_identifier)
906b92e 309
            (fn_argument_list)))))))
906b92e 310
04d2270 311
================================================================================
04d2270 312
function - closure with an inline ternary body
04d2270 313
================================================================================
04d2270 314
04d2270 315
fun useClosure() -> Str =
04d2270 316
  f = |n| n > 0 ? "pos" : "nonpos"
04d2270 317
  f(5)
04d2270 318
04d2270 319
--------------------------------------------------------------------------------
04d2270 320
04d2270 321
(source
04d2270 322
  (fn
04d2270 323
    (fn_identifier)
04d2270 324
    (type
04d2270 325
      (type_identifier))
04d2270 326
    (body
04d2270 327
      (assign
04d2270 328
        (var_identifier)
04d2270 329
        (expression
04d2270 330
          (closure
04d2270 331
            (var_identifier)
04d2270 332
            (expression
04d2270 333
              (ternary_expression
04d2270 334
                (expression
04d2270 335
                  (comparison_operator
04d2270 336
                    (primary_expression
04d2270 337
                      (var_identifier))
04d2270 338
                    (primary_expression
04d2270 339
                      (integer))))
04d2270 340
                (expression
04d2270 341
                  (primary_expression
04d2270 342
                    (string
04d2270 343
                      (string_start)
04d2270 344
                      (string_content)
04d2270 345
                      (string_end))))
04d2270 346
                (expression
04d2270 347
                  (primary_expression
04d2270 348
                    (string
04d2270 349
                      (string_start)
04d2270 350
                      (string_content)
04d2270 351
                      (string_end)))))))))
04d2270 352
      (expression
04d2270 353
        (primary_expression
04d2270 354
          (fn_call
04d2270 355
            (var_identifier)
04d2270 356
            (fn_argument_list
04d2270 357
              (expression
04d2270 358
                (primary_expression
04d2270 359
                  (integer))))))))))
04d2270 360
906b92e 361
================================================================================
906b92e 362
function - function-value type param annotation
906b92e 363
================================================================================
906b92e 364
c06ddba 365
fun each(cb: fn(Int)) -> Bool =
906b92e 366
  True
906b92e 367
906b92e 368
--------------------------------------------------------------------------------
906b92e 369
906b92e 370
(source
906b92e 371
  (fn
906b92e 372
    (fn_identifier)
906b92e 373
    (param
906b92e 374
      (var_identifier)
906b92e 375
      (fn_value_type
906b92e 376
        (type
906b92e 377
          (type_identifier))))
8f91d27 378
    (type
906b92e 379
      (type_identifier))
906b92e 380
    (body
906b92e 381
      (expression
906b92e 382
        (primary_expression
906b92e 383
          (type_identifier))))))
906b92e 384
906b92e 385
================================================================================
906b92e 386
function - function-value type param annotation with generic types and return
906b92e 387
================================================================================
906b92e 388
c06ddba 389
fun each(cb: fn(T) -> U) -> Bool =
906b92e 390
  True
906b92e 391
906b92e 392
--------------------------------------------------------------------------------
906b92e 393
906b92e 394
(source
906b92e 395
  (fn
906b92e 396
    (fn_identifier)
906b92e 397
    (param
906b92e 398
      (var_identifier)
906b92e 399
      (fn_value_type
906b92e 400
        (type
8f91d27 401
          (generic))
906b92e 402
        (type
8f91d27 403
          (generic))))
8f91d27 404
    (type
906b92e 405
      (type_identifier))
906b92e 406
    (body
906b92e 407
      (expression
906b92e 408
        (primary_expression
906b92e 409
          (type_identifier))))))
4ba0db3 410
4ba0db3 411
================================================================================
4ba0db3 412
function - inline closure literal as a call argument
4ba0db3 413
================================================================================
4ba0db3 414
c06ddba 415
fun main() -> Int =
4ba0db3 416
  each(|v| v)
4ba0db3 417
4ba0db3 418
--------------------------------------------------------------------------------
4ba0db3 419
4ba0db3 420
(source
4ba0db3 421
  (fn
4ba0db3 422
    name: (fn_identifier)
8f91d27 423
    returns: (type
4ba0db3 424
      (type_identifier))
4ba0db3 425
    body: (body
4ba0db3 426
      (expression
4ba0db3 427
        (primary_expression
4ba0db3 428
          (fn_call
4ba0db3 429
            function: (var_identifier)
4ba0db3 430
            arguments: (fn_argument_list
4ba0db3 431
              (expression
4ba0db3 432
                (closure
4ba0db3 433
                  parameters: (var_identifier)
4ba0db3 434
                  body: (expression
4ba0db3 435
                    (primary_expression
4ba0db3 436
                      (var_identifier))))))))))))
35af6cf 437
35af6cf 438
================================================================================
35af6cf 439
function - multi-line closure literal call argument, closing paren on same line as body
35af6cf 440
================================================================================
35af6cf 441
c06ddba 442
fun main() -> Int =
35af6cf 443
  each(|v|
35af6cf 444
    v)
35af6cf 445
35af6cf 446
--------------------------------------------------------------------------------
35af6cf 447
35af6cf 448
(source
35af6cf 449
  (fn
35af6cf 450
    name: (fn_identifier)
8f91d27 451
    returns: (type
35af6cf 452
      (type_identifier))
35af6cf 453
    body: (body
35af6cf 454
      (expression
35af6cf 455
        (primary_expression
35af6cf 456
          (fn_call
35af6cf 457
            function: (var_identifier)
35af6cf 458
            arguments: (fn_argument_list
35af6cf 459
              (expression
35af6cf 460
                (closure
35af6cf 461
                  parameters: (var_identifier)
35af6cf 462
                  body: (body
35af6cf 463
                    (expression
35af6cf 464
                      (primary_expression
35af6cf 465
                        (var_identifier)))))))))))))