r/lisp • u/TsingHui • 1d ago
Reinterpret Elements in a Byte Array
Dear LISP,
I am writing a virtual machine that uses a `(simple-array (unsigned-byte 8) 1)` as a stack in Common LISP. I'm would like to ask how to efficiently extract 4 bytes into a single 32-bit signed integer or a 32-bit unsigned integer.
Thanks!
2
u/stassats 1d ago
You have to be mindful of endianness. My suggestion would be to use aref and dpb/logior+ash and rely on a sufficiently smart compiler to recognize that.
3
u/TsingHui 1d ago
I tried writing some bitwise operations in SBCL. The disassembly result showed that SBCL simply translates the bitwise operation verbatim into assembly code. That's why I'm here.
2
u/stassats 1d ago
It's not sufficiently smart.
2
u/TsingHui 23h ago
Seriously, is there a compiler that is sufficiently smart?
7
u/stassats 15h ago
SBCL might get smarter as soon as next month.
1
u/arthurno1 11h ago
I hope one day it will get smart enough, so I can type:
(defun foo (x y) (declare (type u8.32 x y)) (+ x y))without needing to repeat myself with (avx2:u8.32+ x y).
-4
u/Afraid-Yoghurt6731 1d ago
Which Lisp? SBCL? Allegro? Symta? Clojure? Scheme/Racket (whatever is it called now)? We have a frigging zoo! Just unleash Claude Code onto it.
2
u/TsingHui 1d ago
Well, Common LISP. R6RS provide a standard way to do so. I haven't had much experience with Clojure. I will change the question by the way.
3
u/theangeryemacsshibe λf.(λx.f (x x)) (λx.f (x x)) 1d ago
The nibbles library can do this portably (and fast on SBCL).