spec: bitwise operations (bitwise-and/or/xor/not, arithmetic-shift, bit-count, integer-length)
OCaml: land/lor/lxor/lnot/lsl/asr in sx_primitives.ml JS: & | ^ ~ << >> with Kernighan popcount and Math.clz32 for integer-length spec/primitives.sx: stdlib.bitwise module with 7 entries 26 tests, 158 assertions, all pass OCaml+JS Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -2007,4 +2007,49 @@ let () =
|
||||
| [rx] ->
|
||||
let (_, _, flags) = regex_of_value rx in
|
||||
String flags
|
||||
| _ -> raise (Eval_error "regex-flags: (regex)"))
|
||||
| _ -> raise (Eval_error "regex-flags: (regex)"));
|
||||
|
||||
(* Bitwise operations *)
|
||||
register "bitwise-and" (fun args ->
|
||||
match args with
|
||||
| [Integer a; Integer b] -> Integer (a land b)
|
||||
| _ -> raise (Eval_error "bitwise-and: expected (integer integer)"));
|
||||
register "bitwise-or" (fun args ->
|
||||
match args with
|
||||
| [Integer a; Integer b] -> Integer (a lor b)
|
||||
| _ -> raise (Eval_error "bitwise-or: expected (integer integer)"));
|
||||
register "bitwise-xor" (fun args ->
|
||||
match args with
|
||||
| [Integer a; Integer b] -> Integer (a lxor b)
|
||||
| _ -> raise (Eval_error "bitwise-xor: expected (integer integer)"));
|
||||
register "bitwise-not" (fun args ->
|
||||
match args with
|
||||
| [Integer a] -> Integer (lnot a)
|
||||
| _ -> raise (Eval_error "bitwise-not: expected (integer)"));
|
||||
register "arithmetic-shift" (fun args ->
|
||||
match args with
|
||||
| [Integer a; Integer count] ->
|
||||
Integer (if count >= 0 then a lsl count else a asr (-count))
|
||||
| _ -> raise (Eval_error "arithmetic-shift: expected (integer integer)"));
|
||||
register "bit-count" (fun args ->
|
||||
match args with
|
||||
| [Integer a] ->
|
||||
let n = ref (abs a) in
|
||||
let c = ref 0 in
|
||||
while !n <> 0 do
|
||||
c := !c + (!n land 1);
|
||||
n := !n lsr 1
|
||||
done;
|
||||
Integer !c
|
||||
| _ -> raise (Eval_error "bit-count: expected (integer)"));
|
||||
register "integer-length" (fun args ->
|
||||
match args with
|
||||
| [Integer a] ->
|
||||
let n = ref (abs a) in
|
||||
let bits = ref 0 in
|
||||
while !n <> 0 do
|
||||
incr bits;
|
||||
n := !n lsr 1
|
||||
done;
|
||||
Integer !bits
|
||||
| _ -> raise (Eval_error "integer-length: expected (integer)"))
|
||||
|
||||
Reference in New Issue
Block a user