fix string ops, add string find, fix server.spl not being embedded, move stdlib to spl/, fix a null identity loss

This commit is contained in:
Daniella 2024-09-09 19:58:59 +02:00
parent bb4d163b40
commit 15ae8622e1
16 changed files with 111 additions and 59 deletions

View file

@ -2,7 +2,7 @@
func main { mega | with args ; func main { mega | with args ;
[ "sudo" "mkdir" "/usr/lib/spl" ] command-wait; [ "sudo" "mkdir" "/usr/lib/spl" ] command-wait;
[ "sh" "-c" "sudo cp *.spl /usr/lib/spl" ] command-wait; [ "sh" "-c" "sudo cp -r spl/* /usr/lib/spl" ] command-wait;
[ "cargo" "build" "--release" ] command-wait; [ "cargo" "build" "--release" ] command-wait;
[ "sudo" "rm" "/bin/spl" ] command-wait; [ "sudo" "rm" "/bin/spl" ] command-wait;
[ "sudo" "cp" "target/release/spl" "/bin" ] command-wait; [ "sudo" "cp" "target/release/spl" "/bin" ] command-wait;

View file

@ -1,4 +1,4 @@
"messaging bus, aka event bus" "messaging bus, aka event bus";
construct messaging namespace { construct messaging namespace {
Message Message

View file

@ -53,7 +53,7 @@ construct net:server:ServerStream {
this this
} }
accept { Stream | with this ; accept { Stream | with this ;
def stream null Stream settype =stream def stream Stream:mkinstance =stream
this:id accept-server-stream stream:=id this:id accept-server-stream stream:=id
stream stream
} }

View file

@ -30,55 +30,77 @@ construct FrameInfo {
construct _str_ext { construct _str_ext {
; ;
new { any | with this ; new { any | :mkinstance:construct }
null clone this settype:construct mkinstance { any | with this ;
null clone this settype
} }
to-bytes { [int] | str-to-bytes } to-bytes { [int] | str-to-bytes }
split { str | with splitter this ; split { str | with splitter this ;
def bytes splitter:to-bytes =bytes splitter:to-bytes =splitter
def iter this:to-bytes:iter =iter def bytes this:to-bytes =bytes
def item 0 =item def i 0 =i
[ while { item null eq not } { [ [ while { i bytes:len lt } {
def match 0 =match def match 0 =match
[ while { match i + bytes:len lt match splitter:len lt and } {
while { match bytes:len eq not } { i match + bytes:get (match splitter:get) eq dup if {
iter:next =item
item null eq if {
3 stop
}
item dup (match bytes:get) eq dup if {
match ++ =match
} not if {
0 =match
}
}
{ | pop pop } match:foreach
] _str
} ]
}
replace { str | with replacee replacement this ;
def bytes replacee:to-bytes =bytes
def iter this:to-bytes:iter =iter
def item 0 =item
[ while { item null eq not } {
def match 0 =match
while { match bytes:len eq not } {
iter:next =item
item null eq if {
3 stop
}
item dup (match bytes:get) eq dup if {
match ++ =match match ++ =match
} not if { } not if {
0 =match 0 =match
3 stop
} }
} }
{ | pop pop } match:foreach i bytes:get
match bytes:len eq if { match splitter:len eq if {
replacement _array :to-stack pop ] _str [
i match + 1 - =i
} }
i ++ =i
} ] _str ]
}
replace { str | with replacee replacement this ;
replacee:to-bytes =replacee
def bytes this:to-bytes =bytes
def i 0 =i
[ while { i bytes:len lt } {
def match 0 =match
while { match i + bytes:len lt match replacee:len lt and } {
i match + bytes:get (match replacee:get) eq dup if {
match ++ =match
} not if {
0 =match
3 stop
}
}
i bytes:get
match replacee:len eq if {
pop replacement:to-bytes:to-stack
i match + 1 - =i
}
i ++ =i
} ] _str } ] _str
} }
find { idx | with search this ;
search:to-bytes =search
def bytes this:to-bytes =bytes
def i 0 =i
while { i bytes:len lt } {
def match 0 =match
while { match i + bytes:len lt match search:len lt and } {
i match + bytes:get (match search:get) eq dup if {
match ++ =match
} not if {
0 =match
3 stop
}
}
match search:len eq if {
i
4 stop
}
i ++ =i
}
null
}
starts-with { bool | with beginning this ; starts-with { bool | with beginning this ;
beginning:to-bytes this:to-bytes:starts-with beginning:to-bytes this:to-bytes:starts-with
} }

View file

@ -35,7 +35,7 @@ construct Stream {
def read def read
while { buf this:id read-stream pop _mega dup =read } { while { buf this:id read-stream pop _mega dup =read } {
full (0 read buf:sub) aadd =full full (0 read buf:sub) aadd =full
} } pop
full full
} }
write { mega | with buf this ; write { mega | with buf this ;

View file

@ -1,17 +1,18 @@
use crate::Runtime; use crate::Runtime;
use multicall::multicall; use multicall::multicall;
pub const STD: &str = include_str!("../std.spl"); pub const STD: &str = include_str!("../spl/std.spl");
pub const NET: &str = include_str!("../net.spl"); pub const NET: &str = include_str!("../spl/net.spl");
pub const ITER: &str = include_str!("../iter.spl"); pub const ITER: &str = include_str!("../spl/iter.spl");
pub const HTTP: &str = include_str!("../http.spl"); pub const HTTP: &str = include_str!("../spl/http.spl");
pub const STREAM: &str = include_str!("../stream.spl"); pub const STREAM: &str = include_str!("../spl/stream.spl");
pub const MESSAGING: &str = include_str!("../messaging.spl"); pub const MESSAGING: &str = include_str!("../spl/messaging.spl");
pub const ASSEMBLE: &str = include_str!("../assemble.spl"); pub const ASSEMBLE: &str = include_str!("../spl/assemble.spl");
pub const ISBPL: &str = include_str!("../isbpl.spl"); pub const ISBPL: &str = include_str!("../spl/isbpl.spl");
pub const REPL: &str = include_str!("../repl.spl"); pub const REPL: &str = include_str!("../spl/repl.spl");
pub const PURE: &str = include_str!("../pure.spl"); pub const PURE: &str = include_str!("../spl/pure.spl");
pub const TIME: &str = include_str!("../time.spl"); pub const TIME: &str = include_str!("../spl/time.spl");
pub const SERVER: &str = include_str!("../spl/server.spl");
pub const NOP: &str = ""; pub const NOP: &str = "";
pub fn register(runtime: &mut Runtime) { pub fn register(runtime: &mut Runtime) {
@ -28,6 +29,7 @@ pub fn register(runtime: &mut Runtime) {
insert("repl.spl", REPL); insert("repl.spl", REPL);
insert("pure.spl", PURE); insert("pure.spl", PURE);
insert("time.spl", TIME); insert("time.spl", TIME);
insert("server.spl", SERVER);
insert("nop.spl", NOP); insert("nop.spl", NOP);
} }
} }

View file

@ -1,5 +1,4 @@
use std::{ use std::{
borrow::BorrowMut,
collections::HashMap, collections::HashMap,
hint::black_box, hint::black_box,
io::{Read, Write}, io::{Read, Write},

View file

@ -1,4 +1,4 @@
[
"#stream.spl" import "#stream.spl" import
"#http.spl" import "#http.spl" import
"#messaging.spl" import "#messaging.spl" import
@ -8,6 +8,7 @@
"SPL tester" =program-name "SPL tester" =program-name
func main { int | with args ; func main { int | with args ;
def thing def thing
1 anew =thing 1 anew =thing
@ -110,7 +111,7 @@ func main { int | with args ;
def file "test.txt" 1 StreamTypes:file:create =file def file "test.txt" 1 StreamTypes:file:create =file
"hi\n" :to-bytes file:write-exact; "hi\n" :to-bytes file:write-exact;
file:close null =file file:close; null =file
"" println "" println
"testing split" println "testing split" println
@ -119,9 +120,9 @@ func main { int | with args ;
catch { catch {
use net:http:Request use net:http:Request
"testing http" println "testing http" println;
def req "data.tudbut.de" 80 "GET" "/spltest" Request:new =req def req "data.tudbut.de" 80 "GET" "/spltest" Request:new =req
req:send:body _str println req:send:body _str println;
} { with e ; } { with e ;
e:message println e:message println
"it seems the internet is not available" println "it seems the internet is not available" println
@ -180,9 +181,37 @@ func main { int | with args ;
def client "localhost" 4075 StreamTypes:tcp:create =client def client "localhost" 4075 StreamTypes:tcp:create =client
1024 client:read-to-end:to-str println; 1024 client:read-to-end:to-str println;
" ^ this should say 'Hello!'" println; " ^ this should say 'Hello!'" println;
"you now have a chance to connect too: localhost:4075 - continuing in 5 seconds..." println; "you now have a chance to connect too: localhost:4075 - continuing in 2 seconds..." println;
5000 time:sleep; 2000 time:sleep;
"" println
"testing string replace" println;
"aba" "!!" "ababab" :replace println;
" ^ should be !!bab." println;
"aba" "!!" "aababab" :replace println;
" ^ should be a!!bab." println;
"" println;
"testing string split" println;
"ba" "abaabaabaa" :split:iter:join<", "> println;
" ^ should be a, a, a, a" println;
"ba" "abbaabbaababaa" :split:iter:join<", "> println;
" ^ should be ab, ab, a, , a" println;
"" println;
"testing string find" println;
"abba" "ababba" :find println;
"^ should be 2" println;
] dup :len 0 eq not if {
"" println
"!! something went wrong somewhere. the stack is not empty." println
dyn-__dump
}
100 100
} }