aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorMarvin Borner2024-03-02 23:12:34 +0100
committerMarvin Borner2024-03-02 23:12:34 +0100
commit03155d6e515c76d5ab59f814592484c849313130 (patch)
tree278ef66ae5a9cf37dfad915094cd3f81ed378d66
parentca3907431bfde5aa0715945222ce777d72e6b411 (diff)
Bottles of beer
-rw-r--r--samples/rosetta/99_bottles_of_beer.bruijn12
-rw-r--r--std/Char.bruijn5
-rw-r--r--std/List.bruijn1
-rw-r--r--std/Math.bruijn8
-rw-r--r--std/String.bruijn19
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")