--- /dev/null
+(define-module (lang elisp primitives numbers)
+ #:use-module (lang elisp internals fset)
+ #:use-module (lang elisp internals null))
+
+(fset 'logior logior)
+(fset 'logand logand)
+(fset 'integerp (lambda->nil integer?))
+(fset '= =)
+(fset '< <)
+(fset '> >)
+(fset '<= <=)
+(fset '>= >=)
+(fset '* *)
+(fset '+ +)
+(fset '- -)
+(fset '1- 1-)
+(fset 'ash ash)
+
+(fset 'lsh
+ (let ()
+ (define (lsh num shift)
+ (cond ((= shift 0)
+ num)
+ ((< shift 0)
+ ;; Logical shift to the right. Do an arithmetic
+ ;; shift and then mask out the sign bit.
+ (lsh (logand (ash num -1) most-positive-fixnum)
+ (+ shift 1)))
+ (else
+ ;; Logical shift to the left. Guile's ash will
+ ;; always preserve the sign of the result, which is
+ ;; not what we want for lsh, so we need to work
+ ;; around this.
+ (let ((new-sign-bit (ash (logand num
+ (logxor most-positive-fixnum
+ (ash most-positive-fixnum -1)))
+ 1)))
+ (lsh (logxor new-sign-bit
+ (ash (logand num most-positive-fixnum) 1))
+ (- shift 1))))))
+ lsh))
+
+(fset 'numberp (lambda->nil number?))