Closure is not a pair.

* module/mes/base.mes (closure_p, mes_car, mes_cdr): New function.
  (pair_p): Closure is not a pair.
* NEWS: Mention it.
* psyntax-0.mes (self-evaluating?): Add closure?.
This commit is contained in:
Jan Nieuwenhuizen 2016-12-19 19:35:38 +01:00
parent c93096fe5f
commit 2390d46a63
5 changed files with 29 additions and 3 deletions

2
NEWS
View File

@ -22,6 +22,8 @@ block-comments are all handled by the Scheme reader later.
*** Lambda* and define* are now supported. *** Lambda* and define* are now supported.
*** #;-comment is now supported. *** #;-comment is now supported.
*** Non-nested #| |#-comment is now supported. *** Non-nested #| |#-comment is now supported.
** Noteworthy bug fixes
*** Closure is not a pair.
* Changes in 0.3 since 0.2 * Changes in 0.3 since 0.2
** Core ** Core
*** Number-based rather than pointer-based cells. *** Number-based rather than pointer-based cells.

View File

@ -59,5 +59,5 @@
(define (procedure? p) (define (procedure? p)
(cond ((builtin? p) #t) (cond ((builtin? p) #t)
((and (pair? p) (eq? (car p) 'lambda))) ((and (pair? p) (eq? (car p) 'lambda)))
((and (pair? p) (eq? (car p) '*closure*))) ((closure? p) #t)
(#t #f))) (#t #f)))

View File

@ -33,7 +33,7 @@
(define annotation? (lambda (x) #f)) (define annotation? (lambda (x) #f))
(define (self-evaluating? x) (define (self-evaluating? x)
(or (boolean? x) (number? x) (string? x) (char? x) (null? x))) (or (boolean? x) (number? x) (string? x) (char? x) (null? x) (closure? x)))
(define (void) (if #f #f)) (define (void) (if #f #f))

View File

@ -95,4 +95,10 @@ exit $?
"noexpand") "noexpand")
(pass-if "closure 9" (sc-expand)))) (pass-if "closure 9" (sc-expand))))
(pass-if "closure is procedure"
(procedure? (lambda () #t)))
(pass-if-not "closure is not a pair"
(pair? (lambda () #t)))
(result 'report) (result 'report)

20
type.c
View File

@ -26,6 +26,24 @@ char_p (SCM x)
return TYPE (x) == CHAR ? cell_t : cell_f; return TYPE (x) == CHAR ? cell_t : cell_f;
} }
SCM
closure_p (SCM x)
{
return (TYPE (x) == PAIR && CAR (x) == cell_closure) ? cell_t : cell_f;
}
SCM
mes_car (SCM x)
{
return CAR (x);
}
SCM
mes_cdr (SCM x)
{
return CDR (x);
}
SCM SCM
keyword_p (SCM x) keyword_p (SCM x)
{ {
@ -47,7 +65,7 @@ number_p (SCM x)
SCM SCM
pair_p (SCM x) pair_p (SCM x)
{ {
return TYPE (x) == PAIR ? cell_t : cell_f; return (TYPE (x) == PAIR && CAR (x) != cell_closure) ? cell_t : cell_f;
} }
SCM SCM