From 7be78efb6c56c04b8a96b3f4f7f6cf810da04dbf Mon Sep 17 00:00:00 2001 From: Joel Kronqvist Date: Tue, 5 Aug 2025 12:18:11 +0300 Subject: Fixed type of Not, added documentation to the tour for booleans --- TUTORIAL.md | 40 ++++++++++++++++++++++++++++++++++++++++ src/type/check.rs | 4 ++-- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/TUTORIAL.md b/TUTORIAL.md index 7389d55..9494859 100644 --- a/TUTORIAL.md +++ b/TUTORIAL.md @@ -34,6 +34,46 @@ Decimals are truncated in division: ``` +**Booleans** + +Myslip supports booleans and `and`, `or`, `xor` and `not` +for their comparisons. +```console +> true +true : Bool +> false +false : Bool +> (and true true) +true : Bool +> (or true false) +true : Bool +> (xor true true) +false : Bool +> (not true) +false : Bool +``` + + +**Integer comparisons** + +To generate booleans from integers, some basic and quite +self-explanatory operators are supplied. +```console +> (> 2 1) +true : Bool +> (< 1 2) +true : Bool +> (>= 1 1) +true : Bool +> (<= 1 1) +true : Bool +> (= 1 1) +true : Bool +> (!= 1 1) +false : Bool +``` + + **Lists** Lists in myslip correspond to what is known as tuples in many diff --git a/src/type/check.rs b/src/type/check.rs index d678411..81a43a4 100644 --- a/src/type/check.rs +++ b/src/type/check.rs @@ -64,7 +64,7 @@ impl SExp { /// assert_eq!(Atom(And).type_check(), Ok(arr(List(vec![Boolean, Boolean]), Boolean))); /// assert_eq!(Atom(Or) .type_check(), Ok(arr(List(vec![Boolean, Boolean]), Boolean))); /// assert_eq!(Atom(Xor).type_check(), Ok(arr(List(vec![Boolean, Boolean]), Boolean))); - /// assert_eq!(Atom(Not).type_check(), Ok(arr(Boolean, Boolean))); + /// assert_eq!(Atom(Not).type_check(), Ok(arr(List(vec![Boolean]), Boolean))); /// ``` /// /// Though perhaps the most important task of the type system @@ -147,7 +147,7 @@ impl SExp { Atom(Eq | Neq | Lt | Gt | Le | Ge) => Ok(arr(List(vec![Integer, Integer]), Boolean)), Atom(Or | And | Xor) => Ok(arr(List(vec![Boolean, Boolean]), Boolean)), - Atom(Not) => Ok(arr(Boolean, Boolean)), + Atom(Not) => Ok(arr(List(vec!(Boolean)), Boolean)), Atom(Nil) => Ok(List(vec![])), Atom(Quote) => Ok(arr( VarType("T".to_string()), -- cgit v1.2.3