1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- (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?))
|