From 738121c18a43146d4ba6a91c7d878026590222c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Madeleine=20Sydney=20=C5=9Alaga?= Date: Tue, 22 Sep 2026 04:03:02 -0600 Subject: [PATCH] --- src/r7rs.ebnf | 14 ++++++++++++-- src/scm.clj | 11 ++++++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/r7rs.ebnf b/src/r7rs.ebnf index 79a7c7b..fd47ea7 100644 --- a/src/r7rs.ebnf +++ b/src/r7rs.ebnf @@ -5,11 +5,17 @@ boolean = #"#(t(rue)?|f(alse)?)" semicolon = ';' left-paren = '(' right-paren = ')' +dot = '.' (* datum *) - = simple-datum + = simple-datum | compound-datum + = boolean | symbol | number | string + = any-list - = boolean | symbol | number +(* list *) + = proper-list | improper-list +proper-list = datum* +improper-list = datum+ datum (* symbol *) symbol = ordinary-symbol @@ -23,6 +29,10 @@ num-10 = sign #"[0-9]+" sign = ('+' | '-')? exactness = ('#i' | '#e')? +(* string *) +string = <'"'> string-element* <'"'> + = #'[^"\\]' | '\\"' | '\\\\' + (* atmosphere *) atmosphere = whitespace | comment | directive whitespace = intraline-whitespace | line-ending diff --git a/src/scm.clj b/src/scm.clj index 474d8ef..9fad3bd 100644 --- a/src/scm.clj +++ b/src/scm.clj @@ -1,7 +1,8 @@ (ns scm (:require [instaparse.core :as insta] [clojure.java.io :as io] - [clojure.core.match :refer [match]]) + [clojure.core.match :refer [match]] + [clojure.string :as str]) (:refer-clojure :exclude [read])) @@ -60,6 +61,14 @@ (match x (:or "#t" "#true") true (:or "#f" "#false") false)]) + :string (fn [& els] + (apply str + (for [e els] + (match e + "\\\\" "\\" + "\\\"" "\"" + "\\n" "\n" + _ e)))) :sign (fn ([] identity) ([x] (match x "-" - "+" identity)))