summaryrefslogtreecommitdiff
path: root/guix/base32.scm
diff options
context:
space:
mode:
authorMarius Bakke <marius@gnu.org>2021-09-17 01:25:52 +0200
committerMarius Bakke <marius@gnu.org>2021-09-17 01:25:52 +0200
commit5c3cb22c9b2810669999e044b2de5e9331011a83 (patch)
tree3276e19cc1a0af3cece6ce4f2bfa930901888bb4 /guix/base32.scm
parentc896287ce5eff968a0b323f3a069653a64b96b4c (diff)
parent2a054d29dcfd4b68ed3914886b637f93ac7a0a72 (diff)
downloadguix-patches-5c3cb22c9b2810669999e044b2de5e9331011a83.tar
guix-patches-5c3cb22c9b2810669999e044b2de5e9331011a83.tar.gz
Merge branch 'master' into core-updates-frozen
Conflicts: gnu/packages/bioinformatics.scm gnu/packages/chez.scm gnu/packages/docbook.scm gnu/packages/ebook.scm gnu/packages/gnome.scm gnu/packages/linux.scm gnu/packages/networking.scm gnu/packages/python-web.scm gnu/packages/python-xyz.scm gnu/packages/tex.scm gnu/packages/version-control.scm gnu/packages/xml.scm guix/build-system/dune.scm guix/build-system/go.scm guix/build-system/linux-module.scm guix/packages.scm
Diffstat (limited to 'guix/base32.scm')
-rw-r--r--guix/base32.scm15
1 files changed, 14 insertions, 1 deletions
diff --git a/guix/base32.scm b/guix/base32.scm
index 49f191ba26..d6c8a02243 100644
--- a/guix/base32.scm
+++ b/guix/base32.scm
@@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2015, 2017 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2015, 2017, 2021 Ludovic Courtès <ludo@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -42,6 +42,19 @@
;;;
;;; Code:
+(define-syntax bit-field
+ (lambda (s)
+ ;; This inline version of 'bit-field' assumes that START and END are
+ ;; literals and pre-computes the mask. In an ideal world, using 'define'
+ ;; or 'define-inlinable' would be enough, but as of 3.0.7, peval doesn't
+ ;; expand calls to 'expt' (and 'bit-field' is a subr.)
+ (syntax-case s ()
+ ((_ n start end)
+ (let* ((s (syntax->datum #'start))
+ (e (syntax->datum #'end))
+ (mask (- (expt 2 (- e s)) 1)))
+ #`(logand (ash n (- start)) #,mask))))))
+
(define bytevector-quintet-ref
(let* ((ref bytevector-u8-ref)
(ref+ (lambda (bv offset)