LDPL Code Examples


The LDPL Community has written a number of LDPL code examples to help beginners learn the language by example. These examples are divided in three levels by (apparent) difficulty: beginner, intermediate and advanced. Feel free to browse them in any order you like and reuse any parts of their code.

If you'd like to contribute with an example, please check the LDPL Contributors Guide and then submit a pull request to the LDPL Repository.

If you find an error within an example please submit an issue to the LDPL Repository.

Beginner Examples

Intermediate Examples

Advanced Examples

These examples can also be found at the /examples folder of the LDPL Repository.


Hello World

Description: displays Hello World!.
File: helloworld.ldpl.

procedure:
display "Hello World!" crlf

Loop Counter

Description: counts from 1 to 1.000.000.
File: loop_counter.ldpl.

data:
    n is number
    
procedure:
    for n from 0 to 1000000 step 1 do
        display n lf
    repeat

Odd or Not

Description: asks the user for a number and displays if its odd or even.
File: oddornot.ldpl.

data:
    num is number
    mod is number
  
procedure:
    display "Enter a number: "
    accept num
    modulo num by 2 in mod
    if mod is equal to 0 then
        display num " is even." lf
    else
        display num " is odd." lf
    end if

Absolute Value

Description: asks the user for a number and then prints out its absolute value.
File: absolutevalue.ldpl.

data:
    num is number
  
procedure:
    display "Enter a number: "
    accept num
    if num is greater than or equal to 0 then
        display num lf
    else
        in num solve num * -1
        display num lf
    end if

Leap Year

Description: asks the user for a year and displays if its a leap year or not.
File: leapyear.ldpl.

data: 
    year is number
    divBy4 is number
    divBy100 is number
  
procedure: 
    display "Enter a year: "
    accept year
    modulo year by 4 in divBy4
    modulo year by 100 in divBy100
    if divBy4 is not equal to 0 then
        display year " is a common year." lf
    else if divBy100 is not equal to 0 then
        display year " is a leap year!" lf
    else if divBy4 is not equal to 0 or divBy100 is not equal to 0 then
        display year " is a common year." lf
    else
        display year " is a leap year!" lf
    end if

Disan Count

Description: asks the user for a number and then executes a Disan Count.
File: disancount.ldpl.

data:
    n is number  # Number to count down from
    mod is number  # Result of the modulo operations

procedure:
    # Get number to count down from
    display "Enter a number: "
    accept n
    
    while n is greater than or equal to 0 do
        modulo n by 2 in mod
        if mod is equal to 0 then
            display n crlf
        end if
        in n solve n - 1
    repeat

String Comparison Demo

Description: compares strings.
File: strcmp-demo.ldpl.

procedure:
    if "aaa" is equal to "aaa" then
        display "aaa == aaa" crlf
    end if

    if "aaa" is not equal to "bbb" then
        display "aaa != bbb" crlf
    end if

    if "aaa" is less than "bbb" then
        display "aaa < bbb" crlf
    end if

    if "ccc" is greater than "bbb" then
        display "ccc > bbb" crlf
    end if

    # if two strings have the same characters, the longer string is greater
    if "aaaa" is greater than or equal to "aaa" then
        display "aaaa >= aaa" crlf
    end if

    if "bbb" is less than or equal to "bbbb" then
        display "bbb <= bbbb" crlf
    end if

Argument Print

Description: prints all command line arguments to the screen.
File: arguments.ldpl.

data:
    argument is text

procedure:
    display "You passed these arguments to the program:" crlf
    for each argument in argv do
        display "- " argument crlf
    repeat

99 Bottles of Beer

Description: prints out the song 99 Bottles of Beer.
File: 99bottles.ldpl.

data:
    bottles-in-the-wall is number
    plural is text

procedure:
    store 99 in bottles-in-the-wall

    sub-procedure check-plural
        if bottles-in-the-wall is not equal to 1 then
            store "s" in plural
        else
            store "" in plural
        end if
    end sub-procedure

    while bottles-in-the-wall is greater than 0 do
        call sub-procedure check-plural
        display bottles-in-the-wall " bottle" plural " of beer on the wall," crlf
        display bottles-in-the-wall " bottle" plural " of beer." crlf
        display "Take one down, pass it around," crlf
        in bottles-in-the-wall solve bottles-in-the-wall - 1
        call sub-procedure check-plural
        if bottles-in-the-wall is greater than 0 then
            display bottles-in-the-wall " bottle" plural " of beer on the wall." crlf crlf
        else
            display "No bottles of beer on the wall." crlf
        end if
    repeat

Fibonacci Numbers

Description: prints the first 30 fibonacci numbers.
File: fibonacci.ldpl.

data:
    a is number
    b is number
    swap is number
    length is number

procedure:
    store 1 in a
    store 1 in b
    display a crlf b crlf

    store 30 in length

    while length is greater than 0 do
        store b in swap
        in b solve a + b
        store swap in a
        display b crlf
        in length solve length - 1
    repeat

Euler Problem

Description: prints the sum of all the multiples of 3 or 5 below 1000.
File: euler.ldpl.

data:
    result is number
    i is number
    remainder3 is number
    remainder5 is number
    remainder is number
    
procedure:
    sub-procedure is-multiple-of
        modulo i by 3 in remainder3
        modulo i by 5 in remainder5
        in remainder solve remainder3 * remainder5
        if remainder is equal to 0 then
            in result solve result + i
        end if
    end sub-procedure
    
    store 0 in i
    store 0 in result
    while i is less than 1000 do
        call sub-procedure is-multiple-of
        in i solve i + 1
    repeat
    
    display result crlf

Square Root

Description: calculates the square root of a number using the Babylonian Method.
File: sqrt.ldpl.

data:
    # Square-root sub-procedure
    sqrt/radicand is number
    sqrt/result is number
    sqrt/aux is number
    sqrt/last-value is number

procedure:
    # Ask for a number
    display "Enter a number: "
    accept sqrt/radicand

    # Declare square root subprocedure
    # Calculates the square root of a radicand using the babylonian method
    # Input parameter:
    # - sqrt/radicand: the number to be square-rooted (preserved)
    # Output parameter:
    # - sqrt/result: the square root of the given number
    sub-procedure square-root
        if sqrt/radicand is equal to 0 then
            store 0 in sqrt/result
            return
        end if
        store 0 in sqrt/last-value
        store 1 in sqrt/result
        while 1 is equal to 1 do
            in sqrt/aux solve sqrt/radicand / sqrt/result
            in sqrt/result solve sqrt/aux + sqrt/result
            in sqrt/result solve sqrt/result / 2
            if sqrt/result is not equal to sqrt/last-value then
                store sqrt/result in sqrt/last-value
            else
                break
            end if
        repeat
    end sub-procedure

    # Calculate square root of the entered number
    call sub-procedure square-root
    display "sqrt(" sqrt/radicand ") = " sqrt/result crlf

Note that this example doesn't use parameters in its sub-procedures. This is because this example was written for older versions of the LDPL programming language that didn't support parameter passing.

Text Explode

Description: asks the user to enter some text and then splits it into a list of words without using the built in split statement.
File: explode.ldpl.

data:
    explode/words is text vector
    explode/index is number
    explode/string is text
    explode/length is number
    explode/stringlength is number
    explode/current-token is text
    explode/char is text
    explode/separator is text
    i is number
    
procedure:
    # Ask for a sentence
    display "Enter a sentence: "
    accept explode/string

    # Declare explode Subprocedure
    # Splits a text into a text vector by a certain delimiter
    # Input parameters:
    # - explode/string: the string to explode (destroyed)
    # - explode/separator: the character used to separate the string (preserved)
    # Output parameters:
    # - explode/words: vector of splitted words
    # - explode/length: length of explode/words
    sub-procedure explode
        join explode/string and explode/separator in explode/string
        get length of explode/string in explode/stringlength
        store 0 in explode/index
        store 0 in explode/length
        store "" in explode/current-token
        while explode/index is less than explode/stringlength do
            get character at explode/index from explode/string in explode/char
            if explode/char is equal to explode/separator then
                store explode/current-token in explode/words:explode/length
                in explode/length solve explode/length + 1
                store "" in explode/current-token
            else
                join explode/current-token and explode/char in explode/current-token
            end if
            in explode/index solve explode/index + 1
        repeat
        in explode/length solve explode/length - 1
    end sub-procedure

    # Separate the entered string
    store " " in explode/separator
    call sub-procedure explode
    while i is less than or equal to explode/length do
        display explode/words:i crlf
        in i solve i + 1
    repeat

Note that this example doesn't use parameters in its sub-procedures. This is because this example was written for older versions of the LDPL programming language that didn't support parameter passing.

Quine

Description: a quine that prints its own source code.
File: quine.ldpl.

data:
    a is number vector
    c is text
    n is number
    i is number
    j is number
procedure:

    sub-procedure showu
        store 0 in i
        while i is less than n do
            display "    store "
            display a:i
            display " in "
            display " a:"
            display i crlf
            in i solve i + 1
        repeat
        display "    store "
        display n
        display " in n" crlf
    end sub-procedure

    sub-procedure show
        store 0 in j
        while j is less than n do
            if a:j is equal to 42 then
                call sub-procedure showu
            else
                get ascii character a:j in c
                display c
            end-if
            in j solve j + 1
        repeat
    end sub-procedure

    store 10 in    a:0
    store 68 in    a:1
    store 65 in    a:2
    store 84 in    a:3
    store 65 in    a:4
    store 58 in    a:5
    store 10 in    a:6
    store 32 in    a:7
    store 32 in    a:8
    store 65 in    a:9
    store 32 in    a:10
    store 73 in    a:11
    store 83 in    a:12
    store 32 in    a:13
    store 78 in    a:14
    store 85 in    a:15
    store 77 in    a:16
    store 66 in    a:17
    store 69 in    a:18
    store 82 in    a:19
    store 32 in    a:20
    store 86 in    a:21
    store 69 in    a:22
    store 67 in    a:23
    store 84 in    a:24
    store 79 in    a:25
    store 82 in    a:26
    store 10 in    a:27
    store 32 in    a:28
    store 32 in    a:29
    store 67 in    a:30
    store 32 in    a:31
    store 73 in    a:32
    store 83 in    a:33
    store 32 in    a:34
    store 84 in    a:35
    store 69 in    a:36
    store 88 in    a:37
    store 84 in    a:38
    store 10 in    a:39
    store 32 in    a:40
    store 32 in    a:41
    store 78 in    a:42
    store 32 in    a:43
    store 73 in    a:44
    store 83 in    a:45
    store 32 in    a:46
    store 78 in    a:47
    store 85 in    a:48
    store 77 in    a:49
    store 66 in    a:50
    store 69 in    a:51
    store 82 in    a:52
    store 10 in    a:53
    store 32 in    a:54
    store 32 in    a:55
    store 73 in    a:56
    store 32 in    a:57
    store 73 in    a:58
    store 83 in    a:59
    store 32 in    a:60
    store 78 in    a:61
    store 85 in    a:62
    store 77 in    a:63
    store 66 in    a:64
    store 69 in    a:65
    store 82 in    a:66
    store 10 in    a:67
    store 32 in    a:68
    store 32 in    a:69
    store 74 in    a:70
    store 32 in    a:71
    store 73 in    a:72
    store 83 in    a:73
    store 32 in    a:74
    store 78 in    a:75
    store 85 in    a:76
    store 77 in    a:77
    store 66 in    a:78
    store 69 in    a:79
    store 82 in    a:80
    store 10 in    a:81
    store 80 in    a:82
    store 82 in    a:83
    store 79 in    a:84
    store 67 in    a:85
    store 69 in    a:86
    store 68 in    a:87
    store 85 in    a:88
    store 82 in    a:89
    store 69 in    a:90
    store 58 in    a:91
    store 10 in    a:92
    store 10 in    a:93
    store 32 in    a:94
    store 32 in    a:95
    store 83 in    a:96
    store 85 in    a:97
    store 66 in    a:98
    store 45 in    a:99
    store 80 in    a:100
    store 82 in    a:101
    store 79 in    a:102
    store 67 in    a:103
    store 69 in    a:104
    store 68 in    a:105
    store 85 in    a:106
    store 82 in    a:107
    store 69 in    a:108
    store 32 in    a:109
    store 83 in    a:110
    store 72 in    a:111
    store 79 in    a:112
    store 87 in    a:113
    store 85 in    a:114
    store 10 in    a:115
    store 32 in    a:116
    store 32 in    a:117
    store 32 in    a:118
    store 32 in    a:119
    store 83 in    a:120
    store 84 in    a:121
    store 79 in    a:122
    store 82 in    a:123
    store 69 in    a:124
    store 32 in    a:125
    store 48 in    a:126
    store 32 in    a:127
    store 73 in    a:128
    store 78 in    a:129
    store 32 in    a:130
    store 73 in    a:131
    store 10 in    a:132
    store 32 in    a:133
    store 32 in    a:134
    store 32 in    a:135
    store 32 in    a:136
    store 87 in    a:137
    store 72 in    a:138
    store 73 in    a:139
    store 76 in    a:140
    store 69 in    a:141
    store 32 in    a:142
    store 73 in    a:143
    store 32 in    a:144
    store 73 in    a:145
    store 83 in    a:146
    store 32 in    a:147
    store 76 in    a:148
    store 69 in    a:149
    store 83 in    a:150
    store 83 in    a:151
    store 32 in    a:152
    store 84 in    a:153
    store 72 in    a:154
    store 65 in    a:155
    store 78 in    a:156
    store 32 in    a:157
    store 78 in    a:158
    store 32 in    a:159
    store 68 in    a:160
    store 79 in    a:161
    store 10 in    a:162
    store 32 in    a:163
    store 32 in    a:164
    store 32 in    a:165
    store 32 in    a:166
    store 32 in    a:167
    store 32 in    a:168
    store 32 in    a:169
    store 32 in    a:170
    store 68 in    a:171
    store 73 in    a:172
    store 83 in    a:173
    store 80 in    a:174
    store 76 in    a:175
    store 65 in    a:176
    store 89 in    a:177
    store 32 in    a:178
    store 34 in    a:179
    store 32 in    a:180
    store 32 in    a:181
    store 83 in    a:182
    store 84 in    a:183
    store 79 in    a:184
    store 82 in    a:185
    store 69 in    a:186
    store 32 in    a:187
    store 34 in    a:188
    store 10 in    a:189
    store 32 in    a:190
    store 32 in    a:191
    store 32 in    a:192
    store 32 in    a:193
    store 32 in    a:194
    store 32 in    a:195
    store 32 in    a:196
    store 32 in    a:197
    store 68 in    a:198
    store 73 in    a:199
    store 83 in    a:200
    store 80 in    a:201
    store 76 in    a:202
    store 65 in    a:203
    store 89 in    a:204
    store 32 in    a:205
    store 65 in    a:206
    store 58 in    a:207
    store 73 in    a:208
    store 10 in    a:209
    store 32 in    a:210
    store 32 in    a:211
    store 32 in    a:212
    store 32 in    a:213
    store 32 in    a:214
    store 32 in    a:215
    store 32 in    a:216
    store 32 in    a:217
    store 68 in    a:218
    store 73 in    a:219
    store 83 in    a:220
    store 80 in    a:221
    store 76 in    a:222
    store 65 in    a:223
    store 89 in    a:224
    store 32 in    a:225
    store 34 in    a:226
    store 32 in    a:227
    store 73 in    a:228
    store 78 in    a:229
    store 32 in    a:230
    store 34 in    a:231
    store 10 in    a:232
    store 32 in    a:233
    store 32 in    a:234
    store 32 in    a:235
    store 32 in    a:236
    store 32 in    a:237
    store 32 in    a:238
    store 32 in    a:239
    store 32 in    a:240
    store 68 in    a:241
    store 73 in    a:242
    store 83 in    a:243
    store 80 in    a:244
    store 76 in    a:245
    store 65 in    a:246
    store 89 in    a:247
    store 32 in    a:248
    store 34 in    a:249
    store 32 in    a:250
    store 65 in    a:251
    store 58 in    a:252
    store 34 in    a:253
    store 10 in    a:254
    store 32 in    a:255
    store 32 in    a:256
    store 32 in    a:257
    store 32 in    a:258
    store 32 in    a:259
    store 32 in    a:260
    store 32 in    a:261
    store 32 in    a:262
    store 68 in    a:263
    store 73 in    a:264
    store 83 in    a:265
    store 80 in    a:266
    store 76 in    a:267
    store 65 in    a:268
    store 89 in    a:269
    store 32 in    a:270
    store 73 in    a:271
    store 32 in    a:272
    store 67 in    a:273
    store 82 in    a:274
    store 76 in    a:275
    store 70 in    a:276
    store 10 in    a:277
    store 32 in    a:278
    store 32 in    a:279
    store 32 in    a:280
    store 32 in    a:281
    store 32 in    a:282
    store 32 in    a:283
    store 32 in    a:284
    store 32 in    a:285
    store 73 in    a:286
    store 78 in    a:287
    store 32 in    a:288
    store 73 in    a:289
    store 32 in    a:290
    store 83 in    a:291
    store 79 in    a:292
    store 76 in    a:293
    store 86 in    a:294
    store 69 in    a:295
    store 32 in    a:296
    store 73 in    a:297
    store 32 in    a:298
    store 43 in    a:299
    store 32 in    a:300
    store 49 in    a:301
    store 10 in    a:302
    store 32 in    a:303
    store 32 in    a:304
    store 32 in    a:305
    store 32 in    a:306
    store 82 in    a:307
    store 69 in    a:308
    store 80 in    a:309
    store 69 in    a:310
    store 65 in    a:311
    store 84 in    a:312
    store 10 in    a:313
    store 32 in    a:314
    store 32 in    a:315
    store 32 in    a:316
    store 32 in    a:317
    store 68 in    a:318
    store 73 in    a:319
    store 83 in    a:320
    store 80 in    a:321
    store 76 in    a:322
    store 65 in    a:323
    store 89 in    a:324
    store 32 in    a:325
    store 34 in    a:326
    store 32 in    a:327
    store 32 in    a:328
    store 83 in    a:329
    store 84 in    a:330
    store 79 in    a:331
    store 82 in    a:332
    store 69 in    a:333
    store 32 in    a:334
    store 34 in    a:335
    store 10 in    a:336
    store 32 in    a:337
    store 32 in    a:338
    store 32 in    a:339
    store 32 in    a:340
    store 68 in    a:341
    store 73 in    a:342
    store 83 in    a:343
    store 80 in    a:344
    store 76 in    a:345
    store 65 in    a:346
    store 89 in    a:347
    store 32 in    a:348
    store 78 in    a:349
    store 10 in    a:350
    store 32 in    a:351
    store 32 in    a:352
    store 32 in    a:353
    store 32 in    a:354
    store 68 in    a:355
    store 73 in    a:356
    store 83 in    a:357
    store 80 in    a:358
    store 76 in    a:359
    store 65 in    a:360
    store 89 in    a:361
    store 32 in    a:362
    store 34 in    a:363
    store 32 in    a:364
    store 73 in    a:365
    store 78 in    a:366
    store 32 in    a:367
    store 78 in    a:368
    store 34 in    a:369
    store 32 in    a:370
    store 67 in    a:371
    store 82 in    a:372
    store 76 in    a:373
    store 70 in    a:374
    store 10 in    a:375
    store 32 in    a:376
    store 32 in    a:377
    store 69 in    a:378
    store 78 in    a:379
    store 68 in    a:380
    store 32 in    a:381
    store 83 in    a:382
    store 85 in    a:383
    store 66 in    a:384
    store 45 in    a:385
    store 80 in    a:386
    store 82 in    a:387
    store 79 in    a:388
    store 67 in    a:389
    store 69 in    a:390
    store 68 in    a:391
    store 85 in    a:392
    store 82 in    a:393
    store 69 in    a:394
    store 10 in    a:395
    store 10 in    a:396
    store 32 in    a:397
    store 32 in    a:398
    store 83 in    a:399
    store 85 in    a:400
    store 66 in    a:401
    store 45 in    a:402
    store 80 in    a:403
    store 82 in    a:404
    store 79 in    a:405
    store 67 in    a:406
    store 69 in    a:407
    store 68 in    a:408
    store 85 in    a:409
    store 82 in    a:410
    store 69 in    a:411
    store 32 in    a:412
    store 83 in    a:413
    store 72 in    a:414
    store 79 in    a:415
    store 87 in    a:416
    store 10 in    a:417
    store 32 in    a:418
    store 32 in    a:419
    store 32 in    a:420
    store 32 in    a:421
    store 83 in    a:422
    store 84 in    a:423
    store 79 in    a:424
    store 82 in    a:425
    store 69 in    a:426
    store 32 in    a:427
    store 48 in    a:428
    store 32 in    a:429
    store 73 in    a:430
    store 78 in    a:431
    store 32 in    a:432
    store 74 in    a:433
    store 10 in    a:434
    store 32 in    a:435
    store 32 in    a:436
    store 32 in    a:437
    store 32 in    a:438
    store 87 in    a:439
    store 72 in    a:440
    store 73 in    a:441
    store 76 in    a:442
    store 69 in    a:443
    store 32 in    a:444
    store 74 in    a:445
    store 32 in    a:446
    store 73 in    a:447
    store 83 in    a:448
    store 32 in    a:449
    store 76 in    a:450
    store 69 in    a:451
    store 83 in    a:452
    store 83 in    a:453
    store 32 in    a:454
    store 84 in    a:455
    store 72 in    a:456
    store 65 in    a:457
    store 78 in    a:458
    store 32 in    a:459
    store 78 in    a:460
    store 32 in    a:461
    store 68 in    a:462
    store 79 in    a:463
    store 10 in    a:464
    store 32 in    a:465
    store 32 in    a:466
    store 32 in    a:467
    store 32 in    a:468
    store 32 in    a:469
    store 32 in    a:470
    store 32 in    a:471
    store 32 in    a:472
    store 73 in    a:473
    store 70 in    a:474
    store 32 in    a:475
    store 65 in    a:476
    store 58 in    a:477
    store 74 in    a:478
    store 32 in    a:479
    store 73 in    a:480
    store 83 in    a:481
    store 32 in    a:482
    store 69 in    a:483
    store 81 in    a:484
    store 85 in    a:485
    store 65 in    a:486
    store 76 in    a:487
    store 32 in    a:488
    store 84 in    a:489
    store 79 in    a:490
    store 32 in    a:491
    store 52 in    a:492
    store 50 in    a:493
    store 32 in    a:494
    store 84 in    a:495
    store 72 in    a:496
    store 69 in    a:497
    store 78 in    a:498
    store 10 in    a:499
    store 32 in    a:500
    store 32 in    a:501
    store 32 in    a:502
    store 32 in    a:503
    store 32 in    a:504
    store 32 in    a:505
    store 32 in    a:506
    store 32 in    a:507
    store 32 in    a:508
    store 32 in    a:509
    store 67 in    a:510
    store 65 in    a:511
    store 76 in    a:512
    store 76 in    a:513
    store 32 in    a:514
    store 83 in    a:515
    store 85 in    a:516
    store 66 in    a:517
    store 45 in    a:518
    store 80 in    a:519
    store 82 in    a:520
    store 79 in    a:521
    store 67 in    a:522
    store 69 in    a:523
    store 68 in    a:524
    store 85 in    a:525
    store 82 in    a:526
    store 69 in    a:527
    store 32 in    a:528
    store 83 in    a:529
    store 72 in    a:530
    store 79 in    a:531
    store 87 in    a:532
    store 85 in    a:533
    store 10 in    a:534
    store 32 in    a:535
    store 32 in    a:536
    store 32 in    a:537
    store 32 in    a:538
    store 32 in    a:539
    store 32 in    a:540
    store 32 in    a:541
    store 32 in    a:542
    store 69 in    a:543
    store 76 in    a:544
    store 83 in    a:545
    store 69 in    a:546
    store 10 in    a:547
    store 32 in    a:548
    store 32 in    a:549
    store 32 in    a:550
    store 32 in    a:551
    store 32 in    a:552
    store 32 in    a:553
    store 32 in    a:554
    store 32 in    a:555
    store 32 in    a:556
    store 32 in    a:557
    store 71 in    a:558
    store 69 in    a:559
    store 84 in    a:560
    store 32 in    a:561
    store 65 in    a:562
    store 83 in    a:563
    store 67 in    a:564
    store 73 in    a:565
    store 73 in    a:566
    store 32 in    a:567
    store 67 in    a:568
    store 72 in    a:569
    store 65 in    a:570
    store 82 in    a:571
    store 65 in    a:572
    store 67 in    a:573
    store 84 in    a:574
    store 69 in    a:575
    store 82 in    a:576
    store 32 in    a:577
    store 65 in    a:578
    store 58 in    a:579
    store 74 in    a:580
    store 32 in    a:581
    store 73 in    a:582
    store 78 in    a:583
    store 32 in    a:584
    store 67 in    a:585
    store 10 in    a:586
    store 32 in    a:587
    store 32 in    a:588
    store 32 in    a:589
    store 32 in    a:590
    store 32 in    a:591
    store 32 in    a:592
    store 32 in    a:593
    store 32 in    a:594
    store 32 in    a:595
    store 32 in    a:596
    store 68 in    a:597
    store 73 in    a:598
    store 83 in    a:599
    store 80 in    a:600
    store 76 in    a:601
    store 65 in    a:602
    store 89 in    a:603
    store 32 in    a:604
    store 67 in    a:605
    store 10 in    a:606
    store 32 in    a:607
    store 32 in    a:608
    store 32 in    a:609
    store 32 in    a:610
    store 32 in    a:611
    store 32 in    a:612
    store 32 in    a:613
    store 32 in    a:614
    store 69 in    a:615
    store 78 in    a:616
    store 68 in    a:617
    store 45 in    a:618
    store 73 in    a:619
    store 70 in    a:620
    store 10 in    a:621
    store 32 in    a:622
    store 32 in    a:623
    store 32 in    a:624
    store 32 in    a:625
    store 32 in    a:626
    store 32 in    a:627
    store 32 in    a:628
    store 32 in    a:629
    store 73 in    a:630
    store 78 in    a:631
    store 32 in    a:632
    store 74 in    a:633
    store 32 in    a:634
    store 83 in    a:635
    store 79 in    a:636
    store 76 in    a:637
    store 86 in    a:638
    store 69 in    a:639
    store 32 in    a:640
    store 74 in    a:641
    store 32 in    a:642
    store 43 in    a:643
    store 32 in    a:644
    store 49 in    a:645
    store 10 in    a:646
    store 32 in    a:647
    store 32 in    a:648
    store 32 in    a:649
    store 32 in    a:650
    store 82 in    a:651
    store 69 in    a:652
    store 80 in    a:653
    store 69 in    a:654
    store 65 in    a:655
    store 84 in    a:656
    store 10 in    a:657
    store 32 in    a:658
    store 32 in    a:659
    store 69 in    a:660
    store 78 in    a:661
    store 68 in    a:662
    store 32 in    a:663
    store 83 in    a:664
    store 85 in    a:665
    store 66 in    a:666
    store 45 in    a:667
    store 80 in    a:668
    store 82 in    a:669
    store 79 in    a:670
    store 67 in    a:671
    store 69 in    a:672
    store 68 in    a:673
    store 85 in    a:674
    store 82 in    a:675
    store 69 in    a:676
    store 10 in    a:677
    store 10 in    a:678
    store 42 in    a:679
    store 10 in    a:680
    store 32 in    a:681
    store 32 in    a:682
    store 67 in    a:683
    store 65 in    a:684
    store 76 in    a:685
    store 76 in    a:686
    store 32 in    a:687
    store 83 in    a:688
    store 85 in    a:689
    store 66 in    a:690
    store 45 in    a:691
    store 80 in    a:692
    store 82 in    a:693
    store 79 in    a:694
    store 67 in    a:695
    store 69 in    a:696
    store 68 in    a:697
    store 85 in    a:698
    store 82 in    a:699
    store 69 in    a:700
    store 32 in    a:701
    store 83 in    a:702
    store 72 in    a:703
    store 79 in    a:704
    store 87 in    a:705
    store 10 in    a:706
    store 10 in    a:707
    store 708 in n

    call sub-procedure show

Floyd-Warshall

Description: an implementation of the Floyd-Warshall shortest path algorithm.
File: floyd-warshall.ldpl.

data:
    ∞ is number                   # Infinity value (not really infinity)
    nodeCount   is number         # Number of nodes in the graph
    distances   is number list    # Number matrix that contains the distance from node i to node j
    k is number
    i is number
    j is number
    distanceIKJ is number
    IJ is number
    IK is number
    KJ is number

procedure:
    # Set the value of "infinity" to something big
    store 99999 in ∞

    # Set number of nodes in graph
    store 4 in nodeCount

    # Create distances matrix
    push  0 to distances # 0->0                | 0 1 2 3
    push  3 to distances # 0->1               -+--------
    push  ∞ to distances # 0->2               0| 0 3 ∞ 3
    push  3 to distances # 0->3               1| 2 0 2 2
    push  2 to distances # 1->0               2|-2 ∞ 0 1
    push  0 to distances # 1->1               3| ∞ 4 4 0
    push  2 to distances # 1->2
    push  2 to distances # 1->3               ↑↑↑↑↑↑↑↑↑↑
    push -2 to distances # 2->0               This is the matrix we are making.
    push  ∞ to distances # 2->1               We use a list to store it, like this:
    push  0 to distances # 2->2               [0, 3, ∞, 3, 2, 0, 2, 2, -2, ∞, 0, 1, ∞, 4, 4, 0]
    push  1 to distances # 2->3
    push  ∞ to distances # 3->0               The value [i][j], i being the rows and j the columns
    push  4 to distances # 3->1               stores the length of the shortest known path from i to j.
    push  4 to distances # 3->2
    push  0 to distances # 3->3

    # --- Invariant -------------------------------------------------
    # When the k-th iteration is over, our distances matrix stores
    # in the position (i, j) the length of the shortest path from i
    # to j using only vertices contained in the set {0 .. k}. This
    # means that in the second iteration (k = 1), the position (i, j)
    # will hold the length of the shortest path from i to j that uses
    # only nodes 0 and 1.
    # ---------------------------------------------------------------

    store 0 in k
    while k is less than nodeCount do
        store 0 in i
        while i is less than nodeCount do
            store 0 in j
            while j is less than nodeCount do
                in IJ solve j + (i * nodeCount)
                in IK solve k + (i * nodeCount)
                in KJ solve j + (k * nodeCount)
                in distanceIKJ solve distances:IK + distances:KJ
                # If the length of the path i -> k -> j
                # is shorter than the length of i -> j...
                if distanceIKJ is less than distances:IJ then
                    # ...then replace the shortest distance that we've recorded
                    # between these two nodes for the one that we've just found.
                    store distanceIKJ in distances:IJ
                end if
                in j solve j + 1
            repeat
            in i solve i + 1
        repeat
        in k solve k + 1
    repeat

    # --- Negative cycles ----------------------------------------------
    # While the algorithm asumes that no negative cycles are to be found
    # in the graph, we can detect whether the graph has negative cycles
    # or not by executing the loop above one more time and inspecting
    # the diagonal of the distances matrix: the presence of a negative
    # number indicates that the graph contains at least one negative
    # cycle.
    # ------------------------------------------------------------------

    # Print the result:
    store 0 in i
    while i is less than nodeCount do
        store 0 in j
        while j is less than nodeCount do
            in IJ solve j + (i * nodeCount)
            if distances:IJ is greater than or equal to 0 then
                display " "
            end if
            display distances:IJ " "
            in j solve j + 1
        repeat
        display crlf
        in i solve i + 1
    repeat

Brainfuck Interpreter

Description: a Brainfuck interpreter.
File: brainfuck.ldpl.

data:
    argc is number                  # Argument count
    source-file is text             # Brainfuck source code
    source-length is number         # Length of Brainfuck Source File
    current-char is text            # Current character in source
    ip is number                    # Instruction Pointer
    tape is number vector           # Brainfuck Tape
    pointer is number               # Brainfuck Tape Pointer
    temp-text is text               # Auxiliar text variable
    i is number                     # Auxiliar iteration variable
    open-[]-found is number         # Number of open []s found

procedure:
    # Check if we received a filename
    get length of argv in argc
    if argc is less than 1 then
        display "No file to execute passed!" crlf "Usage: brainfuck-bin " crlf
        exit
    end if

    # Load brainfuck source file
    load file argv:0 in source-file
    get length of source-file in source-length
    display "Source loaded." crlf
    display "Source length: " source-length crlf

    # Execute
    while ip is less than source-length do
        get character at ip from source-file in current-char
        
        if current-char is equal to "+" then
            in tape:pointer solve 1 + tape:pointer

        else if current-char is equal to "-" then
            in tape:pointer solve tape:pointer - 1

        else if current-char is equal to ">" then
            in pointer solve 1 + pointer

        else if current-char is equal to "<" then
            in pointer solve pointer - 1

        else if current-char is equal to "." then
            get ascii character tape:pointer in temp-text
            display temp-text

        else if current-char is equal to "," then
            accept tape:pointer

        else if current-char is equal to "[" then
            if tape:pointer is equal to 0 then
                store 1 in open-[]-found
                while open-[]-found is greater than 0 do
                    in ip solve 1 + ip
                    get character at ip from source-file in temp-text
                    if temp-text is equal to "[" then
                        in open-[]-found solve 1 + open-[]-found
                    else if temp-text is equal to "]" then
                        in open-[]-found solve open-[]-found - 1
                    end if
                repeat
            end if

        else if current-char is equal to "]" then
            if tape:pointer is not equal to 0 then
                store 1 in open-[]-found
                while open-[]-found is greater than 0 do
                    in ip solve ip - 1
                    get character at ip from source-file in temp-text
                    if temp-text is equal to "]" then
                        in open-[]-found solve 1 + open-[]-found
                    else if temp-text is equal to "[" then
                        in open-[]-found solve open-[]-found - 1
                    end if
                repeat
            end if
        end if
        
        # Otherwise character is ignored as per spec
        in ip solve 1 + ip
    repeat

Bellman-Ford

Description: an implementation of the Bellman-Ford shortest path algorithm.
File: bellman-ford.ldpl.

data:
    ∞ is number                 # Infinity value (not really infinity)
    nodeCount    is number      # Number of nodes in the graph
    edgeCount    is number      # Number of edges in the graph
    edgesStart   is number list # List of the starting nodes of each edge in the graph
    edgesEnd     is number list # List of the destination nodes of each edge in the graph
    edgesWeight  is number list # List of the weight of each edge in the graph
    startingNode is number      # The starting node for our algorithm
    distances    is number list # List that holds the minimum distance from i to the starting node
    i is number
    j is number
    newDistance  is number

procedure:
    # Set the value of "infinity" to something big
    store 99999 in ∞

    # Set number of nodes in graph
    store 6 in nodeCount

    # Initialize each index of the distances list to infinity
    while j is less than nodeCount do
        push ∞ to distances
        in j solve j + 1
    repeat

    # Set distance from starting node to itself to 0
    store 0 in startingNode
    store 0 in distances:startingNode

    # Set graph edges
    push  0 to edgesStart    # l(0 -> 1) = 4
    push  1 to edgesEnd
    push  4 to edgesWeight
    push  0 to edgesStart    # l(0 -> 2) = 7
    push  2 to edgesEnd
    push  7 to edgesWeight
    push  0 to edgesStart    # l(0 -> 5) = 3
    push  5 to edgesEnd
    push  3 to edgesWeight
    push  1 to edgesStart    # l(1 -> 2) = 3
    push  2 to edgesEnd
    push  3 to edgesWeight
    push  1 to edgesStart    # l(1 -> 4) = 1
    push  4 to edgesEnd
    push  1 to edgesWeight
    push  1 to edgesStart    # l(1 -> 5) = -2
    push  5 to edgesEnd
    push -2 to edgesWeight
    push  2 to edgesStart    # l(2 -> 3) = 1
    push  3 to edgesEnd
    push  1 to edgesWeight
    push  2 to edgesStart    # l(2 -> 4) = 1
    push  4 to edgesEnd
    push  1 to edgesWeight
    push  4 to edgesStart    # l(4 -> 3) = 4
    push  3 to edgesEnd
    push  4 to edgesWeight
    push  5 to edgesStart    # l(5 -> 4) = 3
    push  4 to edgesEnd
    push  3 to edgesWeight

    # Store the number of edges in our graph
    get length of edgesWeight in edgeCount

    # --- Invariant -------------------------------------------------
    # When the k-th iteration is over, our distances list holds the
    # length of the shortest path from the starting node to every
    # other path in the graph of length less than or equal to k.
    # This means, the lengths of the paths from 'startingNode' to
    # node i that use at most k edges.
    # ---------------------------------------------------------------

    while i is less than nodeCount do
        # For every edge in the graph
        store 0 in j
        while j is less than edgeCount do
            # If the distance from the starting node to the starting node of
            # this edge plus the weight of this edge...
            in newDistance solve distances:edgesStart:j + edgesWeight:j
            # ...is less that the distance of the ending node of this edge...
            if newDistance is less than distances:edgesEnd:j then
                #...then this path is shorter, so we'll take it.
                store newDistance in distances:edgesEnd:j
            end if
            in j solve j + 1
        repeat
        in i solve i + 1
    repeat

    # --- Negative cycles ----------------------------------------------
    # While the algorithm asumes that no negative cycles are to be found
    # in the graph, we can detect wether the graph has negative cycles
    # or not by executing the loop above one more time and inspecting
    # or list of distances. If any of the values there is lower than it
    # was before running the loop again, this means that there are
    # negative cycles found within our graph.
    # ------------------------------------------------------------------

    # Print the result:
    display "["
    store 0 in i
    while i is less than nodeCount do
        display distances:i
        in i solve i + 1
        if i is less than nodeCount then
            display ", "
        end if
    repeat
    display "]" crlf