--- /dev/null
+(define-module (lang elisp primitives lists)
+ #:use-module (lang elisp internals fset)
+ #:use-module (lang elisp internals null)
+ #:use-module (lang elisp internals signal))
+
+(fset 'cons cons)
+
+(fset 'null null)
+
+(fset 'not null)
+
+(fset 'car
+ (lambda (l)
+ (if (null l)
+ %nil
+ (car l))))
+
+(fset 'cdr
+ (lambda (l)
+ (if (null l)
+ %nil
+ (cdr l))))
+
+(fset 'eq
+ (lambda (x y)
+ (or (eq? x y)
+ (and (null x) (null y)))))
+
+(fset 'equal
+ (lambda (x y)
+ (or (equal? x y)
+ (and (null x) (null y)))))
+
+(fset 'setcar set-car!)
+
+(fset 'setcdr set-cdr!)
+
+(for-each (lambda (sym proc)
+ (fset sym
+ (lambda (elt list)
+ (if (null list)
+ %nil
+ (if (null elt)
+ (let loop ((l list))
+ (cond ((null l) %nil)
+ ((null (car l)) l)
+ (else (loop (cdr l)))))
+ (proc elt list))))))
+ '( memq member assq assoc)
+ `(,memq ,member ,assq ,assoc))
+
+(fset 'length
+ (lambda (x)
+ (cond ((null x) 0)
+ ((pair? x) (length x))
+ ((vector? x) (vector-length x))
+ ((string? x) (string-length x))
+ (else (wta 'sequencep x 1)))))
+
+(fset 'copy-sequence
+ (lambda (x)
+ (cond ((list? x) (list-copy x))
+ ((vector? x) (error "Vector copy not yet implemented"))
+ ((string? x) (string-copy x))
+ (else (wta 'sequencep x 1)))))
+
+(fset 'elt
+ (lambda (obj i)
+ (cond ((pair? obj) (list-ref obj i))
+ ((vector? obj) (vector-ref obj i))
+ ((string? obj) (char->integer (string-ref obj i))))))
+
+(fset 'list list)
+
+(fset 'mapcar
+ (lambda (function sequence)
+ (map (lambda (elt)
+ (elisp-apply function (list elt)))
+ (cond ((null sequence) '())
+ ((list? sequence) sequence)
+ ((vector? sequence) (vector->list sequence))
+ ((string? sequence) (map char->integer (string->list sequence)))
+ (else (wta 'sequencep sequence 2))))))
+
+(fset 'nth
+ (lambda (n list)
+ (if (or (null list)
+ (>= n (length list)))
+ %nil
+ (list-ref list n))))
+
+(fset 'listp
+ (lambda (object)
+ (or (null object)
+ (list? object))))
+
+(fset 'consp pair?)
+
+(fset 'nconc
+ (lambda args
+ (apply append! (map (lambda (arg)
+ (if arg arg '()))
+ args))))