diff options
author | Marvin Borner | 2024-03-02 23:12:34 +0100 |
---|---|---|
committer | Marvin Borner | 2024-03-02 23:12:34 +0100 |
commit | 03155d6e515c76d5ab59f814592484c849313130 (patch) | |
tree | 278ef66ae5a9cf37dfad915094cd3f81ed378d66 | |
parent | ca3907431bfde5aa0715945222ce777d72e6b411 (diff) |
Bottles of beer
-rw-r--r-- | samples/rosetta/99_bottles_of_beer.bruijn | 12 | ||||
-rw-r--r-- | std/Char.bruijn | 5 | ||||
-rw-r--r-- | std/List.bruijn | 1 | ||||
-rw-r--r-- | std/Math.bruijn | 8 | ||||
-rw-r--r-- | std/String.bruijn | 19 |
5 files changed, 36 insertions, 9 deletions
diff --git a/samples/rosetta/99_bottles_of_beer.bruijn b/samples/rosetta/99_bottles_of_beer.bruijn new file mode 100644 index 0000000..7ff3371 --- /dev/null +++ b/samples/rosetta/99_bottles_of_beer.bruijn @@ -0,0 +1,12 @@ +:import std/Combinator . +:import std/Number . +:import std/String . + +main y [[rec]] (+99) + rec =?0 case-end case-rec + case-rec n ++ t1 ++ n ++ t2 ++ t3 ++ n ++ t1 ++ "\n" ++ (1 --0) + n number→string 0 + t1 " bottles of beer on the wall\n" + t2 " bottles of beer\n" + t3 "Take one down, pass it around\n" + case-end empty diff --git a/std/Char.bruijn b/std/Char.bruijn index fc517b3..df6c78b 100644 --- a/std/Char.bruijn +++ b/std/Char.bruijn @@ -5,4 +5,7 @@ :import std/Number/Conversion . # converts a char to a balanced ternary number -number! [binary→ternary (0 - '0')] ⧗ Char → Number +char→number [binary→ternary (0 - '0')] ⧗ Char → Number + +# converts a balanced ternary number to a char +number→char ['0' + (ternary→binary 0)] ⧗ Number → Char diff --git a/std/List.bruijn b/std/List.bruijn index 56e9157..d63ab6a 100644 --- a/std/List.bruijn +++ b/std/List.bruijn @@ -1,7 +1,6 @@ # MIT License, Copyright (c) 2022 Marvin Borner # Lists in Church/Boehm-Berarducci encoding using pairs # implementations are generally lazy (except when they're broken) -# TODO: look into https://hbr.github.io/Lambda-Calculus/lambda2/lambda.html#lists, has more elegant mapping :import std/Combinator . :import std/Pair P diff --git a/std/Math.bruijn b/std/Math.bruijn index ae67136..d9a8c5e 100644 --- a/std/Math.bruijn +++ b/std/Math.bruijn @@ -22,6 +22,14 @@ lmin foldl1 min ⧗ (List Number) → Number :test (lmin ((+2) : ((+1) : {}(+0)))) ((+0)) +# converts number to list of its digits +digits z [[rec]] ⧗ Number → (List Number) + rec =?0 case-end case-rec + case-rec (1 (0 / (+10))) ; (0 % (+10)) + case-end empty + +:test (digits (+0)) (empty) + # list from num to num {…→…} z [[[rec]]] ⧗ Number → Number → (List Number) rec (1 =? ++0) case-end case-list diff --git a/std/String.bruijn b/std/String.bruijn index 5ea6ef9..76121ee 100644 --- a/std/String.bruijn +++ b/std/String.bruijn @@ -1,7 +1,7 @@ # MIT License, Copyright (c) 2022 Marvin Borner :import std/Char C -:import std/Number . +:import std/Math . :import std/Number/Binary B :input std/List @@ -29,21 +29,26 @@ ni? \in? ⧗ String → Char → Boolean :test ("ab" ∋ 'c') (false) # converts a string of digits into a number -number! from-digits ∘ (map C.number!) ⧗ String → Number +string→number from-digits ∘ (map C.char→number) ⧗ String → Number -:test (%(number! "123")) ((+123)) +:test (%(string→number "123")) ((+123)) # converts a signed string of digits into a number -signed-number! [(sign ^0) (number! ~0)] ⧗ String → Number +string→signed-number [(sign ^0) (string→number ~0)] ⧗ String → Number sign [(B.eq? 0 '-') -‣ i] -:test (%(signed-number! "+123")) ((+123)) -:test (%(signed-number! "-123")) ((-123)) +:test (%(string→signed-number "+123")) ((+123)) +:test (%(string→signed-number "-123")) ((-123)) + +# converts a number to a string +number→string (map C.number→char) ∘ digits ⧗ Number → String + +:test (number→string (+123)) ("123") # splits string by newline character lines z [[rec]] ⧗ String → (List String) rec build (break (B.eq? '\n') 0) - build [(~0) [[[^3 : (5 1)]]] {}(^0) ] + build [~0 [[[^3 : (5 1)]]] {}(^0) ] :test (lines "ab\ncd") ("ab" : {}"cd") |