Skip to content

Commit 878673d

Browse files
committed
Add: sols 4.35 -> 4.49
1 parent a44c900 commit 878673d

File tree

19 files changed

+517
-9
lines changed

19 files changed

+517
-9
lines changed

src/ambeval.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ static obj evalstr(char *e, obj env)
2626
return eceval(readp(openin_string(e)), env);
2727
}
2828

29+
#include "output.h"
30+
2931
static void init(obj execution_environment)
3032
{
3133
ambenv = extend_environment(emptylst, emptylst, execution_environment,
@@ -267,10 +269,10 @@ obj ambeval2(obj exp, obj exenv)
267269
make_procedure(list2(value, fail_s), list1(value), emptylst);
268270
obj fail = make_procedure(
269271
emptylst,
270-
list2(list2(of_identifier("display"),
271-
of_string(
272-
"ERROR: (AMBEVAL) unexpected call to amb2's fail")),
273-
failed),
272+
list1( // list2(of_identifier("display"),
273+
// of_string(
274+
// "ERROR: (AMBEVAL) unexpected call to amb2's fail")),
275+
list2(quote, amb_fail)),
274276
emptylst);
275277
return ambeval(exp, exenv, succeed, fail);
276278
}

src/custom.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,12 +238,19 @@ static obj add_extras(int ex, obj env)
238238
" ((eq? item (car x)) x)"
239239
" (else (memq item (cdr x)))))",
240240
env);
241+
evalstr("(define (member item x)"
242+
" (cond ((null? x) false)"
243+
" ((equal? item (car x)) x)"
244+
" (else (member item (cdr x)))))",
245+
env);
241246
}
242247
if (ex >= 254) {
243248
define_variable(of_identifier("equal?"),
244249
of_function(is_equal_p), env);
245250
}
246251
if (ex >= 256) {
252+
define_variable(of_identifier("integer?"),
253+
of_function(is_integer_p), env);
247254
define_variable(of_identifier("number?"),
248255
of_function(is_number_p), env);
249256
define_variable(of_identifier("symbol?"),
@@ -303,6 +310,15 @@ static obj add_extras(int ex, obj env)
303310
env);
304311
evalstr("(define driver-loop repl)", env);
305312
}
313+
if (ex >= 435) {
314+
evalstr("(define (require p) (if (not p) (amb)))", env);
315+
evalstr("(define (distinct? items)"
316+
" (cond ((null? items) true)"
317+
" ((null? (cdr items)) true)"
318+
" ((member (car items) (cdr items)) false)"
319+
" (else (distinct? (cdr items)))))",
320+
env);
321+
}
306322
return unspecified;
307323
}
308324

src/eval.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@
66

77
obj (*eval)(obj, obj) = eceval;
88

9-
void use_ambeval(void)
9+
void use_aneval(void)
1010
{
11-
eval = ambeval2;
11+
eval = aneval;
1212
}
1313

14-
void use_aneval(void)
14+
void use_ambeval(void)
1515
{
16-
eval = aneval;
16+
eval = ambeval2;
1717
}

src/obj.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@ obj (*to_function(obj dat))(obj)
239239
// KEYWORDS
240240

241241
SYMBOL_VAR(amb)
242+
const obj amb_fail = SYMBOL("amb-fail");
242243
const obj and_s = SYMBOL("and");
243244
SYMBOL_VAR(uapply)
244245
const obj __ppapply = SYMBOL("__%%apply");
@@ -250,7 +251,6 @@ const obj cons_stream = SYMBOL("cons-stream");
250251
SYMBOL_VAR(define)
251252
SYMBOL_VAR(delay)
252253
const obj else_s = SYMBOL("else");
253-
SYMBOL_VAR(failed)
254254
const obj if_s = SYMBOL("if");
255255
SYMBOL_VAR(let)
256256
SYMBOL_VAR(letrec)

src/obj.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ obj (*to_function(obj dat))(obj);
120120
// KEYWORDS
121121

122122
extern const obj amb;
123+
extern const obj amb_fail;
123124
extern const obj and_s;
124125
extern const obj uapply;
125126
extern const obj __ppapply;

src/primproc.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -697,6 +697,30 @@ obj is_equal_p(const obj args)
697697
return is_equal(car(args), cadr(args)) ? true_o : false_o;
698698
}
699699

700+
obj is_integer_p(obj args)
701+
{
702+
obj chk;
703+
Floating f;
704+
Integer i;
705+
706+
if (is_err(chk = chkarity("integer?", 1, args)))
707+
return chk;
708+
obj n = car(args);
709+
if (!is_number(n))
710+
return false_o;
711+
switch (subtype(n)) {
712+
case NUMBER_INTEGER:
713+
return true_o;
714+
case NUMBER_FLOATING:
715+
f = to_floating(n);
716+
i = (Integer)f;
717+
return (f == i) ? true_o : false_o;
718+
default:
719+
return error_internal(AREA, "Unknown number type: %d",
720+
subtype(n));
721+
}
722+
}
723+
700724
obj is_number_p(obj args)
701725
{
702726
obj chk;

src/primproc.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ obj is_eq_p(const obj);
5252
bool is_equal(const obj, const obj);
5353
obj is_equal_p(const obj);
5454

55+
obj is_integer_p(obj);
5556
obj is_number_p(obj);
5657
obj is_string_p(obj);
5758
obj is_symbol_p(obj);
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
(%ambeval)
2+
3+
(define (a-pythagorean-triple-between low high)
4+
(let ((i (an-integer-between low high)))
5+
(let ((j (an-integer-between i high)))
6+
(let ((k (an-integer-between j high)))
7+
(require (= (+ (* i i) (* j j)) (* k k)))
8+
(list i j k)))))
9+
10+
(define (an-integer-between low high)
11+
(require (<= low high))
12+
(amb low (an-integer-between (+ low 1) high)))
13+
14+
(a-pythagorean-triple-between 1 50)
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
(%ambeval)
2+
3+
(define (a-pythagorean-triple)
4+
(let ((k (an-integer-starting-from 1)))
5+
(let ((j (an-integer-between 1 k)))
6+
(let ((i (an-integer-between 1 j)))
7+
(require (= (+ (* i i) (* j j)) (* k k)))
8+
(list i j k)))))
9+
10+
(define (an-integer-starting-from start)
11+
(amb start (an-integer-starting-from (+ start 1))))
12+
13+
(define (an-integer-between low high)
14+
(require (<= low high))
15+
(amb low (an-integer-between (+ low 1) high)))
16+
17+
(a-pythagorean-triple)
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
(%ambeval)
2+
3+
(define (a-pythagorean-triple-between low high)
4+
(let ((i (an-integer-between low high))
5+
(hsq (* high high)))
6+
(let ((j (an-integer-between i high)))
7+
(let ((ksq (+ (* i i) (* j j))))
8+
(require (>= hsq ksq))
9+
(let ((k (sqrt ksq)))
10+
(require (integer? k))
11+
(list i j k))))))
12+
13+
(define (an-integer-between low high)
14+
(require (<= low high))
15+
(amb low (an-integer-between (+ low 1) high)))
16+
17+
(a-pythagorean-triple-between 1 50)

0 commit comments

Comments
 (0)