replace cxxr and list? impls by scheme with ones by C

This commit is contained in:
Yuichi Nishiwaki 2014-01-22 21:29:11 +09:00
parent 7fc2885fad
commit d07456466d
2 changed files with 63 additions and 31 deletions

View File

@ -35,10 +35,6 @@
(define-library (picrin bootstrap-tools) (define-library (picrin bootstrap-tools)
(import (scheme base)) (import (scheme base))
(define (caar p) (car (car p)))
(define (cadr p) (car (cdr p)))
(define (cdar p) (cdr (car p)))
(define (cddr p) (cdr (cdr p)))
(define (cadar p) (car (cdar p))) (define (cadar p) (car (cdar p)))
(define (caddr p) (car (cddr p))) (define (caddr p) (car (cddr p)))
(define (cdddr p) (cdr (cddr p))) (define (cdddr p) (cdr (cddr p)))
@ -49,8 +45,7 @@
(cons (f (car list)) (cons (f (car list))
(map f (cdr list))))) (map f (cdr list)))))
(export map caar cadr cdar cddr (export map cadar caddr cdddr))
cadar caddr cdddr))
;;; core syntaces ;;; core syntaces
(define-library (picrin core-syntax) (define-library (picrin core-syntax)
@ -459,25 +454,6 @@
;;; 6.4 Pairs and lists ;;; 6.4 Pairs and lists
(define (list? obj)
(if (null? obj)
#t
(if (pair? obj)
(list? (cdr obj))
#f)))
(define (caar p)
(car (car p)))
(define (cadr p)
(car (cdr p)))
(define (cdar p)
(cdr (car p)))
(define (cddr p)
(cdr (cdr p)))
(define (make-list k . args) (define (make-list k . args)
(if (null? args) (if (null? args)
(make-list k #f) (make-list k #f)

View File

@ -48,8 +48,9 @@ pic_cdr(pic_state *pic, pic_value obj)
bool bool
pic_list_p(pic_state *pic, pic_value obj) pic_list_p(pic_state *pic, pic_value obj)
{ {
while (pic_pair_p(obj)) while (pic_pair_p(obj)) {
obj = pic_pair_ptr(obj)->cdr; obj = pic_pair_ptr(obj)->cdr;
}
return pic_nil_p(obj); return pic_nil_p(obj);
} }
@ -222,6 +223,16 @@ pic_pair_pair_p(pic_state *pic)
return pic_bool_value(pic_pair_p(v)); return pic_bool_value(pic_pair_p(v));
} }
static pic_value
pic_pair_cons(pic_state *pic)
{
pic_value v,w;
pic_get_args(pic, "oo", &v, &w);
return pic_cons(pic, v, w);
}
static pic_value static pic_value
pic_pair_car(pic_state *pic) pic_pair_car(pic_state *pic)
{ {
@ -243,13 +254,43 @@ pic_pair_cdr(pic_state *pic)
} }
static pic_value static pic_value
pic_pair_cons(pic_state *pic) pic_pair_caar(pic_state *pic)
{ {
pic_value v,w; pic_value v;
pic_get_args(pic, "oo", &v, &w); pic_get_args(pic, "o", &v);
return pic_cons(pic, v, w); return pic_caar(pic, v);
}
static pic_value
pic_pair_cadr(pic_state *pic)
{
pic_value v;
pic_get_args(pic, "o", &v);
return pic_cadr(pic, v);
}
static pic_value
pic_pair_cdar(pic_state *pic)
{
pic_value v;
pic_get_args(pic, "o", &v);
return pic_cdar(pic, v);
}
static pic_value
pic_pair_cddr(pic_state *pic)
{
pic_value v;
pic_get_args(pic, "o", &v);
return pic_cddr(pic, v);
} }
static pic_value static pic_value
@ -290,6 +331,16 @@ pic_pair_null_p(pic_state *pic)
return pic_bool_value(pic_nil_p(v)); return pic_bool_value(pic_nil_p(v));
} }
static pic_value
pic_pair_list_p(pic_state *pic)
{
pic_value v;
pic_get_args(pic, "o", &v);
return pic_bool_value(pic_list_p(pic, v));
}
static pic_value static pic_value
pic_pair_list(pic_state *pic) pic_pair_list(pic_state *pic)
{ {
@ -363,12 +414,17 @@ void
pic_init_pair(pic_state *pic) pic_init_pair(pic_state *pic)
{ {
pic_defun(pic, "pair?", pic_pair_pair_p); pic_defun(pic, "pair?", pic_pair_pair_p);
pic_defun(pic, "cons", pic_pair_cons);
pic_defun(pic, "car", pic_pair_car); pic_defun(pic, "car", pic_pair_car);
pic_defun(pic, "cdr", pic_pair_cdr); pic_defun(pic, "cdr", pic_pair_cdr);
pic_defun(pic, "cons", pic_pair_cons);
pic_defun(pic, "set-car!", pic_pair_set_car); pic_defun(pic, "set-car!", pic_pair_set_car);
pic_defun(pic, "set-cdr!", pic_pair_set_cdr); pic_defun(pic, "set-cdr!", pic_pair_set_cdr);
pic_defun(pic, "caar", pic_pair_caar);
pic_defun(pic, "cadr", pic_pair_cadr);
pic_defun(pic, "cdar", pic_pair_cdar);
pic_defun(pic, "cddr", pic_pair_cddr);
pic_defun(pic, "null?", pic_pair_null_p); pic_defun(pic, "null?", pic_pair_null_p);
pic_defun(pic, "list?", pic_pair_list_p);
pic_defun(pic, "list", pic_pair_list); pic_defun(pic, "list", pic_pair_list);
pic_defun(pic, "length", pic_pair_length); pic_defun(pic, "length", pic_pair_length);
pic_defun(pic, "append", pic_pair_append); pic_defun(pic, "append", pic_pair_append);