Skip to content

Commit a44c900

Browse files
committed
Add: amb
1 parent a396c42 commit a44c900

File tree

8 files changed

+45
-26
lines changed

8 files changed

+45
-26
lines changed

src/ambeval.c

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,16 @@
1111
#include "parser.h"
1212
#include "storage.h"
1313

14+
static obj is_amb_p(obj args)
15+
{
16+
return is_amb(car(args)) ? true_o : false_o;
17+
}
18+
19+
static obj amb_choices_p(obj args)
20+
{
21+
return cdar(args);
22+
}
23+
1424
static obj evalstr(char *e, obj env)
1525
{
1626
return eceval(readp(openin_string(e)), env);
@@ -23,6 +33,10 @@ static void init(obj execution_environment)
2333

2434
add_primprocs(ambenv);
2535

36+
define_variable(of_identifier("amb?"), of_function(is_amb_p), ambenv);
37+
define_variable(of_identifier("amb-choices"),
38+
of_function(amb_choices_p), ambenv);
39+
2640
evalstr("(define (map proc . arglists)"
2741
" (define (smap proc items)"
2842
" (define (iter items mapped)"
@@ -42,7 +56,6 @@ static void init(obj execution_environment)
4256
ambenv);
4357

4458
evalstr("(define (analyze exp)"
45-
// " (newline)(display \"Exp:\")(display exp)(newline)"
4659
" (cond ((self-evaluating? exp) "
4760
" (analyze-self-evaluating exp))"
4861
" ((quoted? exp) (analyze-quoted exp))"
@@ -61,6 +74,7 @@ static void init(obj execution_environment)
6174
" ((delay? exp) (analyze (delay->lambda exp)))"
6275
" ((cons-stream? exp) (analyze (cons-stream->cons exp)))"
6376
" ((time? exp) (analyze-time exp))"
77+
" ((amb? exp) (analyze-amb exp))"
6478
" ((apply? exp) (analyze-apply exp))"
6579
" ((application? exp) (analyze-application exp))"
6680
" (else"
@@ -205,6 +219,18 @@ static void init(obj execution_environment)
205219
" (lambda (env succeed fail)"
206220
" (time (proc env succeed fail)))))",
207221
ambenv);
222+
evalstr("(define (analyze-amb exp)"
223+
" (let ((cprocs (map analyze (amb-choices exp))))"
224+
" (lambda (env succeed fail)"
225+
" (define (try-next choices)"
226+
" (if (null? choices)"
227+
" (fail)"
228+
" ((car choices) env"
229+
" succeed"
230+
" (lambda ()"
231+
" (try-next (cdr choices))))))"
232+
" (try-next cprocs))))",
233+
ambenv);
208234
}
209235

210236
static obj ambeval(obj exp, obj exenv, obj succeed, obj fail)

src/bitmap.c

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,6 @@
2626

2727
#define AREA "BITMAP"
2828

29-
#define OBJ_4(TYPE, STYPE, VTYPE, VALUE) \
30-
{ \
31-
TYPE, STYPE, \
32-
{ \
33-
.VTYPE = VALUE \
34-
} \
35-
}
36-
3729
extern unsigned char hamiltondata[];
3830
extern unsigned char patterndata[];
3931
extern unsigned char sussmandata[];

src/error.c

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,6 @@
77

88
#define AREA "ERROR"
99

10-
#define OBJ_4(TYPE, STYPE, VTYPE, VALUE) \
11-
{ \
12-
TYPE, STYPE, \
13-
{ \
14-
.VTYPE = VALUE \
15-
} \
16-
}
17-
1810
enum errsbtyp {
1911
ERROR_MEMORY = 1,
2012
ERROR_ARGUMENT_TYPE, // 2

src/eval.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#include "ambeval.h"
55
#include "aneval.h"
66

7-
obj (*eval)(obj, obj) = ambeval2;
7+
obj (*eval)(obj, obj) = eceval;
88

99
void use_ambeval(void)
1010
{

src/mceval.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,3 +559,8 @@ obj cons_stream_to_cons(obj exp)
559559
list2(memo_proc,
560560
delay_to_lambda(list2(delay, caddr(exp)))));
561561
}
562+
563+
bool is_amb(obj exp)
564+
{
565+
return is_tagged_list(exp, amb);
566+
}

src/mceval.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,6 @@ obj delay_to_lambda(obj exp);
6565
bool is_cons_stream(obj exp);
6666
obj cons_stream_to_cons(obj exp);
6767

68+
bool is_amb(obj exp);
69+
6870
#endif

src/obj.c

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,6 @@
55
#include "error.h"
66
#include "storage.h"
77

8-
#define OBJ_4(TYPE, STYPE, VTYPE, VALUE) \
9-
{ \
10-
TYPE, STYPE, \
11-
{ \
12-
.VTYPE = VALUE \
13-
} \
14-
}
15-
168
#define OBJ_2(TYPE, STYPE) \
179
{ \
1810
TYPE, STYPE, \
@@ -246,6 +238,7 @@ obj (*to_function(obj dat))(obj)
246238

247239
// KEYWORDS
248240

241+
SYMBOL_VAR(amb)
249242
const obj and_s = SYMBOL("and");
250243
SYMBOL_VAR(uapply)
251244
const obj __ppapply = SYMBOL("__%%apply");

src/obj.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,14 @@
55
#include <stdbool.h>
66
#include <inttypes.h>
77

8+
#define OBJ_4(TYPE, STYPE, VTYPE, VALUE) \
9+
{ \
10+
TYPE, STYPE, \
11+
{ \
12+
.VTYPE = VALUE \
13+
} \
14+
}
15+
816
enum type {
917
TYPE_NOT_SET = 0,
1018
TYPE_SYMBOL, // 1
@@ -111,6 +119,7 @@ obj (*to_function(obj dat))(obj);
111119

112120
// KEYWORDS
113121

122+
extern const obj amb;
114123
extern const obj and_s;
115124
extern const obj uapply;
116125
extern const obj __ppapply;

0 commit comments

Comments
 (0)