Skip to content

Commit

Permalink
Add string-join Example
Browse files Browse the repository at this point in the history
  • Loading branch information
iwillspeak committed Jun 17, 2024
1 parent 9a81268 commit ff7606a
Show file tree
Hide file tree
Showing 7 changed files with 47 additions and 9 deletions.
12 changes: 6 additions & 6 deletions spec/chibi-r7rs-tests.scm
Original file line number Diff line number Diff line change
Expand Up @@ -1482,12 +1482,12 @@
;; (test "ab" (substring "abc" 0 2))
;; (test "bc" (substring "abc" 1 3))

;; (test "" (string-append ""))
;; (test "" (string-append "" ""))
;; (test "abc" (string-append "" "abc"))
;; (test "abc" (string-append "abc" ""))
;; (test "abcde" (string-append "abc" "de"))
;; (test "abcdef" (string-append "abc" "de" "f"))
(test "" (string-append ""))
(test "" (string-append "" ""))
(test "abc" (string-append "" "abc"))
(test "abc" (string-append "abc" ""))
(test "abcde" (string-append "abc" "de"))
(test "abcdef" (string-append "abc" "de" "f"))

;; (test '() (string->list ""))
;; (test '(#\a) (string->list "a"))
Expand Down
13 changes: 13 additions & 0 deletions spec/string-join.scm
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
(import (scheme base)
(scheme write))
(define (string-join list delimiter)
(define (string-join-to result list)
(if (null? list)
result
(string-join-to (string-append result delimiter (car list)) (cdr list))))
(if (null? list)
""
(string-join-to (car list) (cdr list))))
(display (string-append "<<{" (string-join '() "-") "}>>"))(newline)
(display (string-join (cons "foo" '()) "||"))(newline)
(display (string-join '("foo" "bar" "baz") ":"))(newline)
2 changes: 1 addition & 1 deletion src/Feersum.Core/base.sld
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
(cons (car args) (flatten (cdr args)))))
(core-apply-vec fun (list->vector (flatten args)))))
(export vector vector? vector-length vector-set! vector-ref make-vector
string=? string->number null? cons list make-list pair? list? car cdr
string=? string->number string-append null? cons list make-list pair? list? car cdr
set-car! set-cdr! length symbol? symbol=? symbol->string string->symbol
eqv? eq? equal? bytevector? make-bytevector bytevector bytevector-length
bytevector-u8-set! bytevector-u8-ref not boolean? boolean=? zero? + - /
Expand Down
16 changes: 16 additions & 0 deletions src/Serehfa/Strings.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Text;
using Serehfa.Attributes;

namespace Serehfa
Expand Down Expand Up @@ -37,5 +38,20 @@ public static object StringToNumber(object[] args)
var (input, bae) = UnpackArgs<string, double>(args);
return (double)Convert.ToUInt64(input, (int)bae);
}

[LispExport("string-append")]
public static object StringAppend(object[] args)
{
CheckAtLeastArgs(args, 1);

var sb = new StringBuilder(Unpack<string>(args[0]));
for (int i = 1; i < args.Length; i++)
{
var toAppend = Unpack<string>(args[i]);
sb.Append(toAppend);
}

return sb.ToString();
}
}
}

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions test/Feersum.Tests/_snapshots/Parse_string-join.scm.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"Diagnostics": [],
"Root": "PROGRAM: (0..483)\n FORM: (0..39)\n OPEN_PAREN: (0..1) \"(\"\n SYMBOL: (1..7)\n IDENTIFIER: (1..7) \"import\"\n ATMOSPHERE: (7..8) \" \"\n FORM: (8..21)\n OPEN_PAREN: (8..9) \"(\"\n SYMBOL: (9..15)\n IDENTIFIER: (9..15) \"scheme\"\n ATMOSPHERE: (15..16) \" \"\n SYMBOL: (16..20)\n IDENTIFIER: (16..20) \"base\"\n CLOSE_PAREN: (20..21) \")\"\n ATMOSPHERE: (21..24) \"\n \"\n FORM: (24..38)\n OPEN_PAREN: (24..25) \"(\"\n SYMBOL: (25..31)\n IDENTIFIER: (25..31) \"scheme\"\n ATMOSPHERE: (31..32) \" \"\n SYMBOL: (32..37)\n IDENTIFIER: (32..37) \"write\"\n CLOSE_PAREN: (37..38) \")\"\n CLOSE_PAREN: (38..39) \")\"\n ATMOSPHERE: (39..40) \"\n\"\n FORM: (40..300)\n OPEN_PAREN: (40..41) \"(\"\n SYMBOL: (41..47)\n IDENTIFIER: (41..47) \"define\"\n ATMOSPHERE: (47..48) \" \"\n FORM: (48..76)\n OPEN_PAREN: (48..49) \"(\"\n SYMBOL: (49..60)\n IDENTIFIER: (49..60) \"string-join\"\n ATMOSPHERE: (60..61) \" \"\n SYMBOL: (61..65)\n IDENTIFIER: (61..65) \"list\"\n ATMOSPHERE: (65..66) \" \"\n SYMBOL: (66..75)\n IDENTIFIER: (66..75) \"delimiter\"\n CLOSE_PAREN: (75..76) \")\"\n ATMOSPHERE: (76..79) \"\n \"\n FORM: (79..229)\n OPEN_PAREN: (79..80) \"(\"\n SYMBOL: (80..86)\n IDENTIFIER: (80..86) \"define\"\n ATMOSPHERE: (86..87) \" \"\n FORM: (87..115)\n OPEN_PAREN: (87..88) \"(\"\n SYMBOL: (88..102)\n IDENTIFIER: (88..102) \"string-join-to\"\n ATMOSPHERE: (102..103) \" \"\n SYMBOL: (103..109)\n IDENTIFIER: (103..109) \"result\"\n ATMOSPHERE: (109..110) \" \"\n SYMBOL: (110..114)\n IDENTIFIER: (110..114) \"list\"\n CLOSE_PAREN: (114..115) \")\"\n ATMOSPHERE: (115..120) \"\n \"\n FORM: (120..228)\n OPEN_PAREN: (120..121) \"(\"\n SYMBOL: (121..123)\n IDENTIFIER: (121..123) \"if\"\n ATMOSPHERE: (123..124) \" \"\n FORM: (124..136)\n OPEN_PAREN: (124..125) \"(\"\n SYMBOL: (125..130)\n IDENTIFIER: (125..130) \"null?\"\n ATMOSPHERE: (130..131) \" \"\n SYMBOL: (131..135)\n IDENTIFIER: (131..135) \"list\"\n CLOSE_PAREN: (135..136) \")\"\n ATMOSPHERE: (136..143) \"\n \"\n SYMBOL: (143..149)\n IDENTIFIER: (143..149) \"result\"\n ATMOSPHERE: (149..156) \"\n \"\n FORM: (156..227)\n OPEN_PAREN: (156..157) \"(\"\n SYMBOL: (157..171)\n IDENTIFIER: (157..171) \"string-join-to\"\n ATMOSPHERE: (171..172) \" \"\n FORM: (172..215)\n OPEN_PAREN: (172..173) \"(\"\n SYMBOL: (173..186)\n IDENTIFIER: (173..186) \"string-append\"\n ATMOSPHERE: (186..187) \" \"\n SYMBOL: (187..193)\n IDENTIFIER: (187..193) \"result\"\n ATMOSPHERE: (193..194) \" \"\n SYMBOL: (194..203)\n IDENTIFIER: (194..203) \"delimiter\"\n ATMOSPHERE: (203..204) \" \"\n FORM: (204..214)\n OPEN_PAREN: (204..205) \"(\"\n SYMBOL: (205..208)\n IDENTIFIER: (205..208) \"car\"\n ATMOSPHERE: (208..209) \" \"\n SYMBOL: (209..213)\n IDENTIFIER: (209..213) \"list\"\n CLOSE_PAREN: (213..214) \")\"\n CLOSE_PAREN: (214..215) \")\"\n ATMOSPHERE: (215..216) \" \"\n FORM: (216..226)\n OPEN_PAREN: (216..217) \"(\"\n SYMBOL: (217..220)\n IDENTIFIER: (217..220) \"cdr\"\n ATMOSPHERE: (220..221) \" \"\n SYMBOL: (221..225)\n IDENTIFIER: (221..225) \"list\"\n CLOSE_PAREN: (225..226) \")\"\n CLOSE_PAREN: (226..227) \")\"\n CLOSE_PAREN: (227..228) \")\"\n CLOSE_PAREN: (228..229) \")\"\n ATMOSPHERE: (229..232) \"\n \"\n FORM: (232..299)\n OPEN_PAREN: (232..233) \"(\"\n SYMBOL: (233..235)\n IDENTIFIER: (233..235) \"if\"\n ATMOSPHERE: (235..236) \" \"\n FORM: (236..248)\n OPEN_PAREN: (236..237) \"(\"\n SYMBOL: (237..242)\n IDENTIFIER: (237..242) \"null?\"\n ATMOSPHERE: (242..243) \" \"\n SYMBOL: (243..247)\n IDENTIFIER: (243..247) \"list\"\n CLOSE_PAREN: (247..248) \")\"\n ATMOSPHERE: (248..253) \"\n \"\n CONSTANT: (253..255)\n STRING: (253..255) \"\"\"\"\n ATMOSPHERE: (255..260) \"\n \"\n FORM: (260..298)\n OPEN_PAREN: (260..261) \"(\"\n SYMBOL: (261..275)\n IDENTIFIER: (261..275) \"string-join-to\"\n ATMOSPHERE: (275..276) \" \"\n FORM: (276..286)\n OPEN_PAREN: (276..277) \"(\"\n SYMBOL: (277..280)\n IDENTIFIER: (277..280) \"car\"\n ATMOSPHERE: (280..281) \" \"\n SYMBOL: (281..285)\n IDENTIFIER: (281..285) \"list\"\n CLOSE_PAREN: (285..286) \")\"\n ATMOSPHERE: (286..287) \" \"\n FORM: (287..297)\n OPEN_PAREN: (287..288) \"(\"\n SYMBOL: (288..291)\n IDENTIFIER: (288..291) \"cdr\"\n ATMOSPHERE: (291..292) \" \"\n SYMBOL: (292..296)\n IDENTIFIER: (292..296) \"list\"\n CLOSE_PAREN: (296..297) \")\"\n CLOSE_PAREN: (297..298) \")\"\n CLOSE_PAREN: (298..299) \")\"\n CLOSE_PAREN: (299..300) \")\"\n ATMOSPHERE: (300..301) \"\n\"\n FORM: (301..360)\n OPEN_PAREN: (301..302) \"(\"\n SYMBOL: (302..309)\n IDENTIFIER: (302..309) \"display\"\n ATMOSPHERE: (309..310) \" \"\n FORM: (310..359)\n OPEN_PAREN: (310..311) \"(\"\n SYMBOL: (311..324)\n IDENTIFIER: (311..324) \"string-append\"\n ATMOSPHERE: (324..325) \" \"\n CONSTANT: (325..330)\n STRING: (325..330) \"\"<<{\"\"\n ATMOSPHERE: (330..331) \" \"\n FORM: (331..352)\n OPEN_PAREN: (331..332) \"(\"\n SYMBOL: (332..343)\n IDENTIFIER: (332..343) \"string-join\"\n ATMOSPHERE: (343..344) \" \"\n QUOTED_DATUM: (344..348)\n QUOTE: (344..345) \"'\"\n FORM: (345..347)\n OPEN_PAREN: (345..346) \"(\"\n CLOSE_PAREN: (346..347) \")\"\n ATMOSPHERE: (347..348) \" \"\n CONSTANT: (348..351)\n STRING: (348..351) \"\"-\"\"\n CLOSE_PAREN: (351..352) \")\"\n ATMOSPHERE: (352..353) \" \"\n CONSTANT: (353..358)\n STRING: (353..358) \"\"}>>\"\"\n CLOSE_PAREN: (358..359) \")\"\n CLOSE_PAREN: (359..360) \")\"\n FORM: (360..369)\n OPEN_PAREN: (360..361) \"(\"\n SYMBOL: (361..368)\n IDENTIFIER: (361..368) \"newline\"\n CLOSE_PAREN: (368..369) \")\"\n ATMOSPHERE: (369..370) \"\n\"\n FORM: (370..415)\n OPEN_PAREN: (370..371) \"(\"\n SYMBOL: (371..378)\n IDENTIFIER: (371..378) \"display\"\n ATMOSPHERE: (378..379) \" \"\n FORM: (379..414)\n OPEN_PAREN: (379..380) \"(\"\n SYMBOL: (380..391)\n IDENTIFIER: (380..391) \"string-join\"\n ATMOSPHERE: (391..392) \" \"\n FORM: (392..408)\n OPEN_PAREN: (392..393) \"(\"\n SYMBOL: (393..397)\n IDENTIFIER: (393..397) \"cons\"\n ATMOSPHERE: (397..398) \" \"\n CONSTANT: (398..403)\n STRING: (398..403) \"\"foo\"\"\n ATMOSPHERE: (403..404) \" \"\n QUOTED_DATUM: (404..407)\n QUOTE: (404..405) \"'\"\n FORM: (405..407)\n OPEN_PAREN: (405..406) \"(\"\n CLOSE_PAREN: (406..407) \")\"\n CLOSE_PAREN: (407..408) \")\"\n ATMOSPHERE: (408..409) \" \"\n CONSTANT: (409..413)\n STRING: (409..413) \"\"||\"\"\n CLOSE_PAREN: (413..414) \")\"\n CLOSE_PAREN: (414..415) \")\"\n FORM: (415..424)\n OPEN_PAREN: (415..416) \"(\"\n SYMBOL: (416..423)\n IDENTIFIER: (416..423) \"newline\"\n CLOSE_PAREN: (423..424) \")\"\n ATMOSPHERE: (424..425) \"\n\"\n FORM: (425..473)\n OPEN_PAREN: (425..426) \"(\"\n SYMBOL: (426..433)\n IDENTIFIER: (426..433) \"display\"\n ATMOSPHERE: (433..434) \" \"\n FORM: (434..472)\n OPEN_PAREN: (434..435) \"(\"\n SYMBOL: (435..446)\n IDENTIFIER: (435..446) \"string-join\"\n ATMOSPHERE: (446..447) \" \"\n QUOTED_DATUM: (447..468)\n QUOTE: (447..448) \"'\"\n FORM: (448..467)\n OPEN_PAREN: (448..449) \"(\"\n CONSTANT: (449..454)\n STRING: (449..454) \"\"foo\"\"\n ATMOSPHERE: (454..455) \" \"\n CONSTANT: (455..460)\n STRING: (455..460) \"\"bar\"\"\n ATMOSPHERE: (460..461) \" \"\n CONSTANT: (461..466)\n STRING: (461..466) \"\"baz\"\"\n CLOSE_PAREN: (466..467) \")\"\n ATMOSPHERE: (467..468) \" \"\n CONSTANT: (468..471)\n STRING: (468..471) \"\":\"\"\n CLOSE_PAREN: (471..472) \")\"\n CLOSE_PAREN: (472..473) \")\"\n FORM: (473..482)\n OPEN_PAREN: (473..474) \"(\"\n SYMBOL: (474..481)\n IDENTIFIER: (474..481) \"newline\"\n CLOSE_PAREN: (481..482) \")\"\n ATMOSPHERE: (482..483) \"\n\"\n"
}
Original file line number Diff line number Diff line change
Expand Up @@ -297,7 +297,7 @@
"Exit": 0
},
"chibi-r7rs-tests.scm": {
"Output": "### (\"R7RS\")\n\t### (\"4.1 Primitive expression types\")\n\t\t...........................\n\t### (\"4.2 Derived expression types\")\n\t\t................\n\t### (\"4.3 Macros\")\n\t\t.\nFAIL: expr: expected outer but got inner\n.\nFAIL: expr: expected |...| but got (|...| |...|)\n\nFAIL: expr: expected (100 |...|) but got (|...| (x |...|))\n\nFAIL: expr: expected (|...| 100 200) but got (|...| (|...| x y))\n....\nFAIL: expr: expected (2 0 fail fail) but got (2 0 2 fail)\n..\nFAIL: expr: expected x but got y\n.\nFAIL: expr: expected |bound-identifier=?| but got |free-identifier=?|\n\nFAIL: expr: expected (100 |...|) but got (x |...|)\n\n\t### (\"5 Program structure\")\n\t\t..\n\t### (\"6.1 Equivalence Predicates\")\n\t\t.........................\n\t### (\"6.2 Numbers\")\n\t\t...\n\t### (\"6.3 Booleans\")\n\t\t..................\n\t### (\"6.4 Lists\")\n\t\t.....................................................\n\t### (\"6.5 Symbols\")\n\t\t.................\n\t### (\"6.6 Characters\")\n\t\t...............................................................................\n\t### (\"6.7 Strings\")\n\t\t\n\t### (\"6.8 Vectors\")\n\t\t........\n\t### (\"6.9 Bytevectors\")\n\t\t..........\n\t### (\"6.10 Control Features\")\n\t\t......\n\t### (\"6.11 Exceptions\")\n\t\t\n\t### (\"6.12 Environments and evaluation\")\n\t\t\n\t### (\"6.13 Input and output\")\n\t\t### (\"Read syntax\")\n\t\t\t\n\t\t### (\"Numeric syntax\")\n\t\t\t\n\t\t\n\t### (\"6.14 System interface\")\n\t\t\n\t\n----------------------\nTotal: 281\nFails: 8\n",
"Output": "### (\"R7RS\")\n\t### (\"4.1 Primitive expression types\")\n\t\t...........................\n\t### (\"4.2 Derived expression types\")\n\t\t................\n\t### (\"4.3 Macros\")\n\t\t.\nFAIL: expr: expected outer but got inner\n.\nFAIL: expr: expected |...| but got (|...| |...|)\n\nFAIL: expr: expected (100 |...|) but got (|...| (x |...|))\n\nFAIL: expr: expected (|...| 100 200) but got (|...| (|...| x y))\n....\nFAIL: expr: expected (2 0 fail fail) but got (2 0 2 fail)\n..\nFAIL: expr: expected x but got y\n.\nFAIL: expr: expected |bound-identifier=?| but got |free-identifier=?|\n\nFAIL: expr: expected (100 |...|) but got (x |...|)\n\n\t### (\"5 Program structure\")\n\t\t..\n\t### (\"6.1 Equivalence Predicates\")\n\t\t.........................\n\t### (\"6.2 Numbers\")\n\t\t...\n\t### (\"6.3 Booleans\")\n\t\t..................\n\t### (\"6.4 Lists\")\n\t\t.....................................................\n\t### (\"6.5 Symbols\")\n\t\t.................\n\t### (\"6.6 Characters\")\n\t\t...............................................................................\n\t### (\"6.7 Strings\")\n\t\t......\n\t### (\"6.8 Vectors\")\n\t\t........\n\t### (\"6.9 Bytevectors\")\n\t\t..........\n\t### (\"6.10 Control Features\")\n\t\t......\n\t### (\"6.11 Exceptions\")\n\t\t\n\t### (\"6.12 Environments and evaluation\")\n\t\t\n\t### (\"6.13 Input and output\")\n\t\t### (\"Read syntax\")\n\t\t\t\n\t\t### (\"Numeric syntax\")\n\t\t\t\n\t\t\n\t### (\"6.14 System interface\")\n\t\t\n\t\n----------------------\nTotal: 287\nFails: 8\n",
"Error": "",
"Exit": 8
},
Expand Down Expand Up @@ -816,5 +816,10 @@
"Message": "Expected expression after `.`"
}
]
},
"string-join.scm": {
"Output": "<<{}>>\nfoo\nfoo:bar:baz\n",
"Error": "",
"Exit": 0
}
}

0 comments on commit ff7606a

Please sign in to comment.