unquote splicing and implemented slime side list comprehensions
This commit is contained in:
+15
-13
@@ -246,8 +246,10 @@ namespace Parser {
|
||||
proc parse_expression(char* text, int* index_in_text) -> Lisp_Object* {
|
||||
|
||||
// if it is quoted
|
||||
// TODO(Felix): This looks totally broken..
|
||||
if (text[*index_in_text] == '\'' ||
|
||||
text[*index_in_text] == '`' ||
|
||||
text[*index_in_text] == '@' ||
|
||||
text[*index_in_text] == ',')
|
||||
{
|
||||
char quoteType = text[*index_in_text];
|
||||
@@ -257,15 +259,12 @@ namespace Parser {
|
||||
if (text[*index_in_text] == '(' ||
|
||||
text[*index_in_text] == '\'' ||
|
||||
text[*index_in_text] == '`' ||
|
||||
text[*index_in_text] == '@' ||
|
||||
text[*index_in_text] == ',')
|
||||
{
|
||||
try {
|
||||
result = parse_expression(text, index_in_text);
|
||||
}
|
||||
try result = parse_expression(text, index_in_text);
|
||||
} else {
|
||||
try {
|
||||
result = parse_atom(text, index_in_text);
|
||||
}
|
||||
try result = parse_atom(text, index_in_text);
|
||||
}
|
||||
|
||||
Lisp_Object* ret = nullptr;
|
||||
@@ -278,10 +277,14 @@ namespace Parser {
|
||||
try ret = Memory::create_lisp_object_pair(
|
||||
Memory::get_or_create_lisp_object_symbol("quasiquote"),
|
||||
Memory::create_lisp_object_pair(result, Memory::nil));
|
||||
else if (quoteType == ',') {
|
||||
else if (quoteType == ',')
|
||||
try ret = Memory::create_lisp_object_pair(
|
||||
Memory::get_or_create_lisp_object_symbol("unquote"),
|
||||
Memory::create_lisp_object_pair(result, Memory::nil));
|
||||
else if (quoteType == '@') {
|
||||
try ret = Memory::create_lisp_object_pair(
|
||||
Memory::get_or_create_lisp_object_symbol("unquote-splicing"),
|
||||
Memory::create_lisp_object_pair(result, Memory::nil));
|
||||
}
|
||||
if (ret) {
|
||||
inject_scl(ret);
|
||||
@@ -316,15 +319,12 @@ namespace Parser {
|
||||
if (text[*index_in_text] == '(' ||
|
||||
text[*index_in_text] == '\''||
|
||||
text[*index_in_text] == '`' ||
|
||||
text[*index_in_text] == '@' ||
|
||||
text[*index_in_text] == ',')
|
||||
{
|
||||
try {
|
||||
head->value.pair.first = parse_expression(text, index_in_text);
|
||||
}
|
||||
try head->value.pair.first = parse_expression(text, index_in_text);
|
||||
} else {
|
||||
try {
|
||||
head->value.pair.first = parse_atom(text, index_in_text);
|
||||
}
|
||||
try head->value.pair.first = parse_atom(text, index_in_text);
|
||||
}
|
||||
|
||||
eat_until_code(text, index_in_text);
|
||||
@@ -475,6 +475,7 @@ namespace Parser {
|
||||
return Memory::nil;
|
||||
if (text[index_in_text] == '(' ||
|
||||
text[index_in_text] == '\'' ||
|
||||
text[index_in_text] == '@' ||
|
||||
text[index_in_text] == '`' ||
|
||||
text[index_in_text] == ',')
|
||||
{
|
||||
@@ -507,6 +508,7 @@ namespace Parser {
|
||||
return Memory::nil;
|
||||
if (text[index_in_text] == '(' ||
|
||||
text[index_in_text] == '\'' ||
|
||||
text[index_in_text] == '@' ||
|
||||
text[index_in_text] == '`' ||
|
||||
text[index_in_text] == ',')
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user