1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
use crate::{
parser::{prelude::*, Code, Input, ParseResult},
value::Value,
};
use super::Sexpr;
impl<'a, 'b, const ECO: Code> Sexpr<'a, ECO> {
/// Parses a quoted literal.
///
/// # Grammar
///
/// ```text
/// quote = "'" intertoken datum
/// ```
pub fn quote(&self) -> impl Fn(Input<'b>) -> ParseResult<'b, Value<'a>> + '_ {
let m = self.m.clone();
move |input| {
map(
preceded(char('\''), preceded(Self::intertoken, self.datum())),
|value| {
let quote = m.borrow_mut().new_symbol("quote");
Value::new_list(m.clone(), [quote.into(), value])
},
)(input)
}
}
/// Parses a quasi-quoted literal.
///
/// # Grammar
///
/// ```text
/// quasiquote = "`" intertoken datum
/// ```
pub fn quasiquote(&self) -> impl Fn(Input<'b>) -> ParseResult<'b, Value<'a>> + '_ {
let m = self.m.clone();
move |input| {
map(
preceded(char('`'), preceded(Self::intertoken, self.datum())),
|value| {
let quote = m.borrow_mut().new_symbol("quasiquote");
Value::new_list(m.clone(), [quote.into(), value])
},
)(input)
}
}
/// Parses an unquoted literal.
///
/// # Grammar
///
/// ```text
/// unquote = "," intertoken datum
/// ```
pub fn unquote(&self) -> impl Fn(Input<'b>) -> ParseResult<'b, Value<'a>> + '_ {
let m = self.m.clone();
move |input| {
map(
preceded(char(','), preceded(Self::intertoken, self.datum())),
|value| {
let quote = m.borrow_mut().new_symbol("unquote");
Value::new_list(m.clone(), [quote.into(), value])
},
)(input)
}
}
/// Parses an unquoted splicing literal.
///
/// # Grammar
///
/// ```text
/// unquote_splicing = ",@" intertoken datum
/// ```
pub fn unquote_splicing(&self) -> impl Fn(Input<'b>) -> ParseResult<'b, Value<'a>> + '_ {
let m = self.m.clone();
move |input| {
map(
preceded(tag(",@"), preceded(Self::intertoken, self.datum())),
|value| {
let quote = m.borrow_mut().new_symbol("unquote-splicing");
Value::new_list(m.clone(), [quote.into(), value])
},
)(input)
}
}
}