Basic string and binary processing

- strings are now made of graphemes
- char is no longer a literal type
- preliminary binary support
- added implicit extraction methods for primitives
- added explicit extraction method for atoms

Nothing has been tested yet
This commit is contained in:
2023-07-02 23:56:54 +01:00
parent cce4b8f11c
commit 751a02a1ec
25 changed files with 440 additions and 76 deletions

View File

@@ -18,7 +18,10 @@ use crate::interpreted::ExprInst;
/// discussed below. The newly bound names (here `s` and `i` before `=`) can
/// also receive type annotations.
///
/// ```
/// ```no_run
/// // FIXME this is a very old example that wouldn't compile now
/// use unicode_segmentation::UnicodeSegmentation;
///
/// use orchidlang::{write_fn_step, Literal, Primitive};
/// use orchidlang::interpreted::Clause;
/// use orchidlang::stl::litconv::{with_str, with_uint};
@@ -36,8 +39,8 @@ use crate::interpreted::ExprInst;
/// CharAt0 { s: String }
/// i = x => with_uint(x, Ok);
/// {
/// if let Some(c) = s.chars().nth(*i as usize) {
/// Ok(Clause::P(Primitive::Literal(Literal::Char(c))))
/// if let Some(c) = s.graphemes(true).nth(*i as usize) {
/// Ok(Literal::Char(c.to_string()).into())
/// } else {
/// RuntimeError::fail(
/// "Character index out of bounds".to_string(),