public inbox for kawa@sourceware.org
 help / color / mirror / Atom feed
* SRFI-60
@ 2014-02-18  6:53 Jamison Hope
  2014-02-18  7:12 ` SRFI-60 Per Bothner
  0 siblings, 1 reply; 10+ messages in thread
From: Jamison Hope @ 2014-02-18  6:53 UTC (permalink / raw)
  To: kawa@sourceware.org list

[-- Attachment #1: Type: text/plain, Size: 1166 bytes --]

I saw that SRFI-60 was almost there, so I went ahead and implemented the rest of it.  The functions all fall into one of these categories:

1. already provided as a builtin with the same name, so nothing to do

2. already provided as a builtin with a different name, so just add an alias

3. functionality is provided by a similar-name builtin but arguments are reordered or signature otherwise changes slightly, so define a wrapper function and then call the builtin

   3.a. name/signature conflicts with a builtin (this happens exactly once, with logbit?)

4. new function, so implement it


Since there are argument order differences compared to existing numbers.scm procedures, I figure this one should probably require an explicit require/import, so it can go in the gnu.kawa.slib package next to srfi1.scm.  Even so, I wonder whether it might be a good idea to remove the builtin logbit? (which is just an alias for bitwise-set-bit? anyway).

I can make the require.java/ImportFromLibrary.java changes, but since this is a new file I wanted to see if I was on the right track first.

--
Jamison Hope
The PTR Group
www.theptrgroup.com



[-- Attachment #2: srfi60.scm --]
[-- Type: application/octet-stream, Size: 3210 bytes --]

;; SRFI-60 implementation for Kawa (almost everything is already built
;; in, but some of the names differ slightly).
;; Copyright (C) 2014 by Jamison Hope.  The implementations of
;; integer->list, list->integer, and booleans->integer were taken with
;; slight modifications from the reference implementation of SRFI-60,
;; which is copyright (C) 1991, 1993, 2001, 2003, 2005 Aubrey Jaffer
;
;Permission to copy this software, to modify it, to redistribute it,
;to distribute modified versions, and to use it for any purpose is
;granted, subject to the following restrictions and understandings.
;
;1.  Any copy made of this software must include this copyright notice
;in full.
;
;2.  I have made no warranty or representation that the operation of
;this software will be error-free, and I am under no obligation to
;provide any services, by way of maintenance, update, or otherwise.
;
;3.  In conjunction with products arising from the use of this
;material, there shall be no use of my name in any advertising,
;promotional, or sales literature without prior written consent in
;each case.

(module-compile-options warn-unknown-member: #t)

;;; These procedures are already Kawa built-ins and do not need to be
;;; defined here: logand/bitwise-and, logior/bitwise-ior,
;;; logxor/bitwise-xor, lognot/bitwise-not, bitwise-if, logtest,
;;; logcount, integer-length, and ash/arithmetic-shift.

;;; These procedures alias functionality provided by built-ins with
;;; differing names:

(define bitwise-merge       bitwise-if)
(define any-bits-set?       logtest)
(define bit-count           logcount)
(define log2-binary-factors bitwise-first-bit-set)
(define first-set-bit       bitwise-first-bit-set)
(define bit-field           bitwise-bit-field)
(define reverse-bit-field   bitwise-reverse-bit-field)

;;; These procedures are similar to built-ins but with arguments
;;; reordered:

;; Note that this shadows the built-in logbit? procedure, which is an
;; alias for bitwise-bit-set?.
(define (logbit? index::int n::integer) ::boolean
  (bitwise-bit-set? n index))
(define bit-set? logbit?)

(define (copy-bit-field to::integer from::integer start::int end::int)
  ::integer
  (bitwise-copy-bit-field to start end from))

(define (rotate-bit-field n::integer count::int start::int end::int)
  ::integer
  (bitwise-rotate-bit-field n start end count))

;;; This procedure has a slightly different signature compared to the
;;; built-in bitwise-copy-bit: the first two arguments are swapped and
;;; the last is a boolean instead of an int
(define (copy-bit index::int from::integer bit::boolean)
  ::integer
  (bitwise-copy-bit from index (if bit 1 0)))

;;; These procedures are entirely new, with implementations derived
;;; from the SRFI-60 reference.
(define (integer->list k::integer #!optional (len ::int (integer-length k)))
  ::list
  (do ((idx ::int (- len 1) (- idx 1))
       (k ::integer k (ash k -1))
       (lst ::list '() (cons (odd? k) lst)))
      ((< idx 0) lst)))

(define (list->integer bools::list) ::integer
  (do ((bs bools (cdr bs))
       (acc ::integer 0 (if (car bs) (+ acc acc 1) (+ acc acc))))
      ((null? bs) acc)))

(define (booleans->integer . bools)
  (list->integer bools))

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: SRFI-60
  2014-02-18  6:53 SRFI-60 Jamison Hope
@ 2014-02-18  7:12 ` Per Bothner
  2014-02-18 16:30   ` SRFI-60 Jamison Hope
  0 siblings, 1 reply; 10+ messages in thread
From: Per Bothner @ 2014-02-18  7:12 UTC (permalink / raw)
  To: Jamison Hope, kawa@sourceware.org list

On 02/17/2014 10:53 PM, Jamison Hope wrote:
> I saw that SRFI-60 was almost there, so I went ahead and implemented the rest of it.

Thanks!

> Since there are argument order differences compared to existing numbers.scm procedures, I figure this one should probably require an explicit require/import, so it can go in the gnu.kawa.slib package next to srfi1.scm.  Even so, I wonder whether it might be a good idea to remove the builtin logbit? (which is just an alias for bitwise-set-bit? anyway).

Yes, I think we should remove the old builtin logbit?  I notice Common 
Lisp's
logbitp uses the (logbitp index integer) order.  I suspect the (logbit? 
integer index)
order is just a bug - it doesn't match any other Scheme I've found.

-- 
	--Per Bothner
per@bothner.com   http://per.bothner.com/

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: SRFI-60
  2014-02-18  7:12 ` SRFI-60 Per Bothner
@ 2014-02-18 16:30   ` Jamison Hope
  2014-02-20  7:54     ` SRFI-60 Per Bothner
  0 siblings, 1 reply; 10+ messages in thread
From: Jamison Hope @ 2014-02-18 16:30 UTC (permalink / raw)
  To: kawa@sourceware.org list


[-- Attachment #1.1: Type: text/plain, Size: 1397 bytes --]

On Feb 18, 2014, at 2:11 AM, Per Bothner <per@bothner.com> wrote:

> On 02/17/2014 10:53 PM, Jamison Hope wrote:
>> I saw that SRFI-60 was almost there, so I went ahead and implemented the rest of it.
> 
> Thanks!

As low hanging fruit go, this one was resting on the ground. :-)

>> Since there are argument order differences compared to existing numbers.scm procedures, I figure this one should probably require an explicit require/import, so it can go in the gnu.kawa.slib package next to srfi1.scm.  Even so, I wonder whether it might be a good idea to remove the builtin logbit? (which is just an alias for bitwise-set-bit? anyway).
> 
> Yes, I think we should remove the old builtin logbit?  I notice Common Lisp's
> logbitp uses the (logbitp index integer) order.  I suspect the (logbit? integer index)
> order is just a bug - it doesn't match any other Scheme I've found.

OK.  That probably still argues for keeping the SRFI-60 version out of the builtins -- if anybody is using the old function by that name and not 'bitwise-bit-set?', it'll be better for them to see a compiler error than to have the semantics altered silently (I wouldn't want to be the one to track down that bug!).

Here's a patch which adds SRFI-60, updates require.java and ImportFromLibrary.java, and removes logbit? from Scheme.java.

--
Jamison Hope
The PTR Group
www.theptrgroup.com



[-- Attachment #1.2: srfi60.patch --]
[-- Type: application/octet-stream, Size: 7924 bytes --]

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 7818)
+++ ChangeLog	(working copy)
@@ -1,3 +1,7 @@
+2014-02-18  Jamison Hope  <jrh@theptrgroup.com>
+
+	* build.xml (slib-scm-classes): Add srfi60.scm.
+
 2014-02-06  Per Bothner  <per@bothner.com>
 
 	* build.xml (commonlisp-scm-classes): Make sure to compile
Index: build.xml
===================================================================
--- build.xml	(revision 7818)
+++ build.xml	(working copy)
@@ -586,6 +586,7 @@
         <file name="srfi14.scm"/>
         <file name="srfi34.scm"/>
         <file name="srfi37.scm"/>
+        <file name="srfi60.scm"/>
         <file name="srfi69.scm"/>
         <file name="pregexp.scm"/>
         <file name="Streams.scm"/>
Index: gnu/kawa/slib/ChangeLog
===================================================================
--- gnu/kawa/slib/ChangeLog	(revision 7818)
+++ gnu/kawa/slib/ChangeLog	(working copy)
@@ -1,3 +1,8 @@
+2014-02-18  Jamison Hope  <jrh@theptrgroup.com>
+
+	* srfi60.scm: New implementation of SRFI-60.
+	* Makefile.am: Update accordingly.
+
 2014-02-06  Seth Alves
 
 	* srfi13.scm (string-trim-right):  Import bug-fix from reference
Index: gnu/kawa/slib/Makefile.am
===================================================================
--- gnu/kawa/slib/Makefile.am	(revision 7818)
+++ gnu/kawa/slib/Makefile.am	(working copy)
@@ -21,7 +21,7 @@
 java_SCM = DefineRecordType.scm enums.scm readtable.scm \
   srfi1.scm srfi2.scm \
   conditions.scm srfi13.scm srfi14.scm srfi34.scm \
-  srfi37.scm srfi69.scm pregexp.scm \
+  srfi37.scm srfi60.scm srfi69.scm pregexp.scm \
   Streams.scm StreamsDerived.scm StreamsPrimitive.scm StreamsType.scm \
   genwrite.scm pp.scm ppfile.scm printf.scm ralists.scm syntaxutils.scm \
   cut.scm testing.scm $(XML_SCM) $(AWT_SCM) $(SWING_SCM)
Index: gnu/kawa/slib/srfi60.scm
===================================================================
--- gnu/kawa/slib/srfi60.scm	(revision 0)
+++ gnu/kawa/slib/srfi60.scm	(working copy)
@@ -0,0 +1,81 @@
+;; SRFI-60 implementation for Kawa (almost everything is already built
+;; in, but some of the names differ slightly).
+;; Copyright (C) 2014 by Jamison Hope.  The implementations of
+;; integer->list, list->integer, and booleans->integer were taken with
+;; slight modifications from the reference implementation of SRFI-60,
+;; which is copyright (C) 1991, 1993, 2001, 2003, 2005 Aubrey Jaffer
+;
+;Permission to copy this software, to modify it, to redistribute it,
+;to distribute modified versions, and to use it for any purpose is
+;granted, subject to the following restrictions and understandings.
+;
+;1.  Any copy made of this software must include this copyright notice
+;in full.
+;
+;2.  I have made no warranty or representation that the operation of
+;this software will be error-free, and I am under no obligation to
+;provide any services, by way of maintenance, update, or otherwise.
+;
+;3.  In conjunction with products arising from the use of this
+;material, there shall be no use of my name in any advertising,
+;promotional, or sales literature without prior written consent in
+;each case.
+
+(module-compile-options warn-unknown-member: #t)
+
+(provide 'srfi-60)
+
+;;; These procedures are already Kawa built-ins and do not need to be
+;;; defined here: logand/bitwise-and, logior/bitwise-ior,
+;;; logxor/bitwise-xor, lognot/bitwise-not, bitwise-if, logtest,
+;;; logcount, integer-length, and ash/arithmetic-shift.
+
+;;; These procedures alias functionality provided by built-ins with
+;;; differing names:
+
+(define bitwise-merge       bitwise-if)
+(define any-bits-set?       logtest)
+(define bit-count           logcount)
+(define log2-binary-factors bitwise-first-bit-set)
+(define first-set-bit       bitwise-first-bit-set)
+(define bit-field           bitwise-bit-field)
+(define reverse-bit-field   bitwise-reverse-bit-field)
+
+;;; These procedures are similar to built-ins but with arguments
+;;; reordered:
+
+(define (logbit? index::int n::integer) ::boolean
+  (bitwise-bit-set? n index))
+(define bit-set? logbit?)
+
+(define (copy-bit-field to::integer from::integer start::int end::int)
+  ::integer
+  (bitwise-copy-bit-field to start end from))
+
+(define (rotate-bit-field n::integer count::int start::int end::int)
+  ::integer
+  (bitwise-rotate-bit-field n start end count))
+
+;;; This procedure has a slightly different signature compared to the
+;;; built-in bitwise-copy-bit: the first two arguments are swapped and
+;;; the last is a boolean instead of an int
+(define (copy-bit index::int from::integer bit::boolean)
+  ::integer
+  (bitwise-copy-bit from index (if bit 1 0)))
+
+;;; These procedures are entirely new, with implementations derived
+;;; from the SRFI-60 reference.
+(define (integer->list k::integer #!optional (len ::int (integer-length k)))
+  ::list
+  (do ((idx ::int (- len 1) (- idx 1))
+       (k ::integer k (ash k -1))
+       (lst ::list '() (cons (odd? k) lst)))
+      ((< idx 0) lst)))
+
+(define (list->integer bools::list) ::integer
+  (do ((bs bools (cdr bs))
+       (acc ::integer 0 (if (car bs) (+ acc acc 1) (+ acc acc))))
+      ((null? bs) acc)))
+
+(define (booleans->integer . bools)
+  (list->integer bools))

Property changes on: gnu/kawa/slib/srfi60.scm
___________________________________________________________________
Added: svn:keywords
## -0,0 +1 ##
+Rev Id
\ No newline at end of property
Index: kawa/ChangeLog
===================================================================
--- kawa/ChangeLog	(revision 7818)
+++ kawa/ChangeLog	(working copy)
@@ -1,3 +1,11 @@
+2014-02-18  Jamison Hope  <jrh@theptrgroup.com>
+
+	* standard/Scheme.java (initScheme): Remove 'logbit?', since it
+	just an alias for 'bitwise-bit-set?' and happens to conflict with
+	the semantics of SRFI-60 'logbit?'.
+	* standard/ImportFromLibrary.java (SRFI97Map): Update for SRFI-60.
+	* standard/require.java (featureMap): Likewise.
+
 2014-02-17  Per Bothner  <per@bothner.com>
 
 	* standard/define.java: Implement 'define-early-constant'.
Index: kawa/standard/ImportFromLibrary.java
===================================================================
--- kawa/standard/ImportFromLibrary.java	(revision 7818)
+++ kawa/standard/ImportFromLibrary.java	(working copy)
@@ -63,7 +63,7 @@
     { "54", "cat", MISSING },
     { "57", "records", MISSING },
     { "59", "vicinities", MISSING },
-    { "60", "integer-bits", MISSING },
+    { "60", "integer-bits", "gnu.kawa.slib.srfi60" },
     { "61", "cond", MISSING },
     { "63", "arrays", MISSING },
     { "64", "testing", "gnu.kawa.slib.testing" },
Index: kawa/standard/Scheme.java
===================================================================
--- kawa/standard/Scheme.java	(revision 7818)
+++ kawa/standard/Scheme.java	(working copy)
@@ -599,8 +599,6 @@
       defProcStFld("lognot", "gnu.kawa.functions.BitwiseOp", "not");
       defProcStFld("logop", "kawa.lib.numbers");
       defProcStFld("bitwise-bit-set?", "kawa.lib.numbers");
-      defProcStFld("logbit?", "kawa.lib.numbers",
-                   Language.mangleNameIfNeeded("bitwise-bit-set?"));
       defProcStFld("logtest", "kawa.lib.numbers");
       defProcStFld("bitwise-bit-count", "kawa.lib.numbers");
       defProcStFld("logcount", "kawa.lib.numbers");
Index: kawa/standard/require.java
===================================================================
--- kawa/standard/require.java	(revision 7818)
+++ kawa/standard/require.java	(working copy)
@@ -97,6 +97,7 @@
     map("srfi-41-streams-type", SLIB_PREFIX + "StreamsType");
     map("srfi-41-streams-primitive", SLIB_PREFIX + "StreamsPrimitive");
     map("srfi-41-streams-derived", SLIB_PREFIX + "StreamsDerived");
+    map("srfi-60", SLIB_PREFIX + "srfi60");
     map("srfi-64", SLIB_PREFIX + "testing");
     map("testing", SLIB_PREFIX + "testing");
     map("srfi-69", SLIB_PREFIX + "srfi69");

[-- Attachment #1.3: Type: text/plain, Size: 1 bytes --]



[-- Attachment #2: Message signed with OpenPGP using GPGMail --]
[-- Type: application/pgp-signature, Size: 204 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: SRFI-60
  2014-02-18 16:30   ` SRFI-60 Jamison Hope
@ 2014-02-20  7:54     ` Per Bothner
  2014-02-20 13:47       ` SRFI-60 Jamison Hope
  0 siblings, 1 reply; 10+ messages in thread
From: Per Bothner @ 2014-02-20  7:54 UTC (permalink / raw)
  To: Jamison Hope, kawa@sourceware.org list

On 02/18/2014 08:30 AM, Jamison Hope wrote:
> Here's a patch which adds SRFI-60, updates require.java and ImportFromLibrary.java, and removes logbit? from Scheme.java.

Thanks - I checked this in.

Note I had to fix testsuite/num-tests.scm, since it used logbit?
-- 
	--Per Bothner
per@bothner.com   http://per.bothner.com/

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: SRFI-60
  2014-02-20  7:54     ` SRFI-60 Per Bothner
@ 2014-02-20 13:47       ` Jamison Hope
  2014-02-20 13:51         ` [PATCH] Was: SRFI-60 Jamison Hope
  0 siblings, 1 reply; 10+ messages in thread
From: Jamison Hope @ 2014-02-20 13:47 UTC (permalink / raw)
  To: kawa@sourceware.org list

On Feb 20, 2014, at 2:54 AM, Per Bothner <per@bothner.com> wrote:

> On 02/18/2014 08:30 AM, Jamison Hope wrote:
>> Here's a patch which adds SRFI-60, updates require.java and ImportFromLibrary.java, and removes logbit? from Scheme.java.
> 
> Thanks - I checked this in.
> 
> Note I had to fix testsuite/num-tests.scm, since it used logbit?

Oops, missed that one.  I realized that I also forgot to update
kawa.texi to remove the "mostly implemented" language.  When I
went to remedy that, I got sidetracked looking to see what other
SRFIs are almost completely supported, or are supported but just
aren't mentioned in that list, and I came up with this:

SRFI 10: Sharp-Comma External Form
	It's there, other than the optional define-reader-ctor,
	which is easy to write using ReadTable#putReaderCtor.

SRFI 34: Exception Handling for Programs
	Seems to be supported, except that some aggressive compiler
	return type checking is making the JVM crash on examples with
	(+ 1 (raise 'an-error)).

SRFI 38: External Representation for Data With Shared Structure
	Is only missing read-with-shared-structure (kawa.texi
	already mentions this).

SRFI 66: Octet Vectors
	Is only missing u8vector=?, u8vector-compare, u8vector-copy!,
	and u8vector-copy.

SRFI 70: Numbers
	I think this is the same as R6RS numbers, which Kawa does
	support, but with a handful of extra functions:
	exact-floor, exact-ceiling, exact-truncate, and exact-round.
	(Any others?  It's a really long document.)

SRFI 72: Simple hygienic macros
	This is syntax-case plus make-capturing-identifier and
	around-syntax, I think.

I also noticed a bug -- the angle of a negative real should be pi,
not 0.  A patch is coming.

--
Jamison Hope
The PTR Group
www.theptrgroup.com



^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH] Was: Re: SRFI-60
  2014-02-20 13:47       ` SRFI-60 Jamison Hope
@ 2014-02-20 13:51         ` Jamison Hope
  2014-02-21 17:54           ` Per Bothner
  0 siblings, 1 reply; 10+ messages in thread
From: Jamison Hope @ 2014-02-20 13:51 UTC (permalink / raw)
  To: kawa@sourceware.org list

[-- Attachment #1: Type: text/plain, Size: 332 bytes --]

On Feb 20, 2014, at 8:47 AM, Jamison Hope <jrh@theptrgroup.com> wrote:

> I realized that I also forgot to update
> kawa.texi to remove the "mostly implemented" language.  When I
> went to remedy that, I got sidetracked

It just happened again.  Here's the update for kawa.texi.

--
Jamison Hope
The PTR Group
www.theptrgroup.com



[-- Attachment #2: doc_srfi60.patch --]
[-- Type: application/octet-stream, Size: 848 bytes --]

Index: doc/ChangeLog
===================================================================
--- doc/ChangeLog	(revision 7819)
+++ doc/ChangeLog	(working copy)
@@ -1,3 +1,7 @@
+2014-02-20  Jamison Hope  <jrh@theptrgroup.com>
+
+	* kawa.texi (Implemented SRFIs): SRFI-60 is now fully supported.
+
 2014-02-17  Per Bothner  <per@bothner.com>
 
 	* kawa.texi (Ideas and tasks): Update.
Index: doc/kawa.texi
===================================================================
--- doc/kawa.texi	(revision 7819)
+++ doc/kawa.texi	(working copy)
@@ -1667,8 +1667,6 @@
 @item
 @uref{http://srfi.schemers.org/srfi-60/srfi-60.html, SRFI 60}:
 Integers as Bits.
-Mostly implemented.  A few functions are missing,
-and a few are only available under other names.
 @item
 @uref{http://srfi.schemers.org/srfi-62/srfi-62.html, SRFI 62}: S-expression comments.
 @item

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] Was: Re: SRFI-60
  2014-02-20 13:51         ` [PATCH] Was: SRFI-60 Jamison Hope
@ 2014-02-21 17:54           ` Per Bothner
  2014-02-22  0:41             ` Jamison Hope
  2014-02-22  8:04             ` Jamison Hope
  0 siblings, 2 replies; 10+ messages in thread
From: Per Bothner @ 2014-02-21 17:54 UTC (permalink / raw)
  To: Jamison Hope, kawa@sourceware.org list

On 02/20/2014 05:51 AM, Jamison Hope wrote:
> It just happened again.  Here's the update for kawa.texi.

We should also update the Logical-Number-Operations section.
I'm inclined to replace the subsection name
"Deprecated Logical Number Operations"
by something like "SRFI-60 Logical Number Operations", and
adding something about having to use import or require.
(Not quite true right now, but it might be a plausible thing to do.)
And of course fix the logbit? description, and add any missing
functions.

It's possible some of these "deprecated" functions aren't SRFI-60;
then we'll have to consider what to do.

Could you do this, since you just looked into it?

-- 
	--Per Bothner
per@bothner.com   http://per.bothner.com/

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] Was: Re: SRFI-60
  2014-02-21 17:54           ` Per Bothner
@ 2014-02-22  0:41             ` Jamison Hope
  2014-02-22  8:04             ` Jamison Hope
  1 sibling, 0 replies; 10+ messages in thread
From: Jamison Hope @ 2014-02-22  0:41 UTC (permalink / raw)
  To: kawa@sourceware.org list

On Feb 21, 2014, at 12:53 PM, Per Bothner <per@bothner.com> wrote:

> Could you do this, since you just looked into it?

I'll take a look, although I'm no texinfo expert.

--
Jamison Hope
The PTR Group
www.theptrgroup.com



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] Was: Re: SRFI-60
  2014-02-21 17:54           ` Per Bothner
  2014-02-22  0:41             ` Jamison Hope
@ 2014-02-22  8:04             ` Jamison Hope
  2014-02-26  7:13               ` Per Bothner
  1 sibling, 1 reply; 10+ messages in thread
From: Jamison Hope @ 2014-02-22  8:04 UTC (permalink / raw)
  To: kawa@sourceware.org list

[-- Attachment #1: Type: text/plain, Size: 6474 bytes --]

On Feb 21, 2014, at 12:53 PM, Per Bothner <per@bothner.com> wrote:

> We should also update the Logical-Number-Operations section.
> I'm inclined to replace the subsection name
> "Deprecated Logical Number Operations"
> by something like "SRFI-60 Logical Number Operations", and
> adding something about having to use import or require.
> (Not quite true right now, but it might be a plausible thing to do.)
> And of course fix the logbit? description, and add any missing
> functions.
> 
> It's possible some of these "deprecated" functions aren't SRFI-60;
> then we'll have to consider what to do.

See attached.

As it turns out, there's one "deprecated" function which is not a
SRFI-60 name: bit-extract.  The SRFI-60 equivalent is called
bit-field.  (Both are equivalent to R6RS bitwise-bit-field.)

Of the non-deprecated Kawa functions, all but logop and logtest are
mandated by R6RS (logtest is in SRFI-60 but has no equivalent in R6RS).
Of the R6RS functions, five of them also appear in SRFI-60 with the
same name: bitwise-not, bitwise-and, bitwise-ior, bitwise-xor, and
bitwise-if.  They all also have alternate names in SRFI-60 (lognot,
logand, logior, logxor, bitwise-merge).


I put in a SRFI-60 section as you suggested.  For now, I marked the
functions which are (old) builtins as such, with language saying that
the rest are available via (require 'srfi-60) or (import (srfi :60)).

I left the "deprecated" subsection there, but it only contains
bit-extract now.  It probably makes sense to just get rid of that
function, but that feels like it should be a separate commit.

BTW here's an org-mode table I made while figuring all this stuff out.

|--------------------------------------------+------+------+---------|
| Function                                   | R6RS | Kawa | SRFI-60 |
|--------------------------------------------+------+------+---------|
| bitwise-not n                              | Y    | Y    | Y       |
| lognot n                                   |      | Dep  | Y       |
|--------------------------------------------+------+------+---------|
| bitwise-and n1 ...                         | Y    | Y    | Y       |
| logand n1 ...                              |      | Dep  | Y       |
|--------------------------------------------+------+------+---------|
| bitwise-ior n1 ...                         | Y    | Y    | Y       |
| logior n1 ...                              |      | Dep  | Y       |
|--------------------------------------------+------+------+---------|
| bitwise-xor n1 ...                         | Y    | Y    | Y       |
| logxor n1 ...                              |      | Dep  | Y       |
|--------------------------------------------+------+------+---------|
| bitwise-if mask n0 n1                      | Y    | Y    | Y       |
| bitwise-merge mask n0 n1                   |      |      | Y       |
|--------------------------------------------+------+------+---------|
| bitwise-bit-count n                        | Y    | Y    |         |
| logcount n                                 |      | Dep  | Y       |
| bit-count n                                |      |      | Y       |
|--------------------------------------------+------+------+---------|
| bitwise-length n                           | Y    | Y    |         |
| integer-length n                           |      | Dep  | Y       |
|--------------------------------------------+------+------+---------|
| bitwise-first-bit-set n                    | Y    | Y    |         |
| log2-binary-factors n                      |      |      | Y       |
| first-set-bit n                            |      |      | Y       |
|--------------------------------------------+------+------+---------|
| bitwise-bit-set? n index                   | Y    | Y    |         |
| logbit? index n                            |      | Dep* | Y       |
| bit-set? index n                           |      |      | Y       |
|--------------------------------------------+------+------+---------|
| bitwise-copy-bit from index bit (int)      | Y    | Y    |         |
| copy-bit index from bit (boolean)          |      |      | Y       |
|--------------------------------------------+------+------+---------|
| bitwise-bit-field n start end              | Y    | Y    |         |
| bit-field n start end                      |      |      | Y       |
| bit-extract n start end                    |      | Dep  |         |
|--------------------------------------------+------+------+---------|
| bitwise-copy-bit-field to start end from   | Y    | Y    |         |
| copy-bit-field to from start end           |      |      | Y       |
|--------------------------------------------+------+------+---------|
| bitwise-arithmetic-shift n count           | Y    | Y    |         |
| arithmetic-shift n count                   |      | Dep  | Y       |
| ash n count                                |      | Dep  | Y       |
|--------------------------------------------+------+------+---------|
| bitwise-arithmetic-shift-left n count      | Y    | Y    |         |
| bitwise-arithmetic-shift-right n count     | Y    | Y    |         |
|--------------------------------------------+------+------+---------|
| bitwise-rotate-bit-field n start end count | Y    | Y    |         |
| rotate-bit-field n count start end         |      |      | Y       |
|--------------------------------------------+------+------+---------|
| bitwise-reverse-bit-field n start end      | Y    | Y    |         |
| reverse-bit-field n start end              |      |      | Y       |
|--------------------------------------------+------+------+---------|
| logtest j k                                |      | Y    | Y       |
| any-bits-set? j k                          |      |      | Y       |
|--------------------------------------------+------+------+---------|
| integer->list k [len]                      |      |      | Y       |
|--------------------------------------------+------+------+---------|
| list->integer list                         |      |      | Y       |
|--------------------------------------------+------+------+---------|
| booleans->integer bool1 ...                |      |      | Y       |
|--------------------------------------------+------+------+---------|
| logop op x y                               |      | Y    |         |
|--------------------------------------------+------+------+---------|


--
Jamison Hope
The PTR Group
www.theptrgroup.com



[-- Attachment #2: detailed_srfi60_documentation.patch --]
[-- Type: application/octet-stream, Size: 5178 bytes --]

Index: doc/ChangeLog
===================================================================
--- doc/ChangeLog	(revision 7826)
+++ doc/ChangeLog	(working copy)
@@ -1,3 +1,10 @@
+2014-02-22  Jamison Hope  <jrh@theptrgroup.com>
+
+	* kawa.texi (Logical Number Operations): New subsection 'SRFI-60
+	Logical Number Operations' documenting the non-R6RS functions in
+	the SRFI.  Many of the functions are moved here from the
+	subsection 'Deprecated Logical Number Operations'.
+
 2014-02-21  Per Bothner  <per@bothner.com>
 
 	* kawa.texi (Ideas and tasks): Various updates.
Index: doc/kawa.texi
===================================================================
--- doc/kawa.texi	(revision 7826)
+++ doc/kawa.texi	(working copy)
@@ -5672,49 +5672,113 @@
 but is more efficient.
 @end deffn
 
-@subsection Deprecated Logical Number Operations
+@subsection SRFI-60 Logical Number Operations
 
-These older functions are still available, but we
-recommand using the R6RS-compatible functions.
+Kawa supports SRFI-60 ``Integers as Bits'' as well, although we
+generally recommend using the R6RS-compatible functions instead when
+possible.  Unless noted as being a builtin function, to use these you
+must first @code{(require 'srfi-60)} or @code{(import (srfi :60))}
+(or @code{(import (srfi :60 integer-bits))}).
 
-@deffn Procedure lognot i
-Equivalent to @code{(bitwise-not @var{i})}.
-@end deffn
-
 @deffn Procedure logand i ...
-Equivalent to @code{(bitwise-and @var{i} ...)}.
+Equivalent to @code{(bitwise-and @var{i} ...)}.  Builtin.
 @end deffn
 
 @deffn Procedure logior i ...
-Equivalent to @code{(bitwise-ior @var{i} ...)}.
+Equivalent to @code{(bitwise-ior @var{i} ...)}.  Builtin.
 @end deffn
 
 @deffn Procedure logxor i ...
-Equivalent to @code{(bitwise-xor @var{i} ...)}.
+Equivalent to @code{(bitwise-xor @var{i} ...)}.  Builtin.
 @end deffn
 
+@deffn Procedure lognot i
+Equivalent to @code{(bitwise-not @var{i})}.  Builtin.
+@end deffn
+
+@deffn Procedure bitwise-merge mask i j
+Equivalent to @code{(bitwise-if @var{mask} @var{i} @var{j})}.
+@end deffn
+
+@deffn Procedure any-bits-set? i j
+Equivalent to @code{(logtest @var{i} @var{j})}.
+@end deffn
+
 @deffn Procedure logcount i
+@deffnx Procedure bit-count i
 Count the number of 1-bits in @var{i}, if it is non-negative.
 If @var{i} is negative, count number of 0-bits.
 Same as @code{(bitwise-bit-count @var{i})} if @var{i} is non-negative.
+Builtin as @func{logcount}.
 @end deffn
 
 @deffn Procedure integer-length i
-Equivalent to @code{(bitwise-length @var{i})}.
+Equivalent to @code{(bitwise-length @var{i})}.  Builtin.
 @end deffn
 
-@deffn Procedure logbit? i pos
-Equivalent to @code{bitwise-bit-set? @var{i} @var{pos})}.
+@deffn Procedure log2-binary-factors i
+@deffnx Procedure first-set-bit i
+Equivalent to @code{(bitwise-first-bit-set @var{i})}.
 @end deffn
 
+@deffn Procedure logbit? pos i
+@deffnx Procedure bit-set? pos i
+Equivalent to @code{(bitwise-bit-set? @var{i} @var{pos})}.
+@end deffn
+
+@deffn Procedure copy-bit bitno i bool
+Equivalent to @code{(bitwise-copy-bit @var{i} @var{bitno} (if @var{bool} 1 0))}.
+@end deffn
+
+@deffn Procedure bit-field n start end
+Equivalent to @code{(bitwise-bit-field @var{n} @var{start} @var{end})}.
+@end deffn
+
+@deffn Procedure copy-bit-field to from start end
+Equivalent to @code{(bitwise-copy-bit-field @var{to} @var{start} @var{end} @var{from})}.
+@end deffn
+
 @deffn Procedure arithmetic-shift i j
-Equivalent to @code{bitwise-arithmetic-shift @var{i} @var{j})}.
+Equivalent to @code{(bitwise-arithmetic-shift @var{i} @var{j})}.  Builtin.
 @end deffn
 
 @deffn Procedure ash i j
-Alias for @code{arithmetic-shift}.
+Alias for @code{arithmetic-shift}.  Builtin.
 @end deffn
 
+@deffn Procedure rotate-bit-field n count start end
+Equivalent to @code{(bitwise-rotate-bit-field @var{n} @var{start} @var{end} @var{count})}.
+@end deffn
+
+@deffn Procedure reverse-bit-field i start end
+Equivalent to @code{(bitwise-reverse-bit-field @var{i} @var{start} @var{end})}.
+@end deffn
+
+@deffn Procedure integer->list @var{k} [@var{length}]
+@deffnx Procedure list->integer @var{list}
+The @func{integer->list} procedure returns a list of @var{length}
+booleans corresponding to the bits of the non-negative integer @var{k},
+with @code{#t} for @code{1} and @code{#f} for @code{0}.  @var{length}
+defaults to @code{(bitwise-length @var{k})}.  The list will be in order
+from MSB to LSB, with the value of @code{(odd? @var{k})} in the last
+car.
+
+The @func{list->integer} procedure returns the integer corresponding to
+the booleans in the list @var{list}.
+The @func{integer->list} and @func{list->integer} procedures are
+inverses so far as @func{equal?} is concerned.
+@end deffn
+
+@deffn Procedure booleans->integer bool1 ...
+Returns the integer coded by the @var{bool1} ... arguments.
+Equivalent to @code{(list->integer (list @var{bool1} ...))}.
+@end deffn
+
+@subsection Deprecated Logical Number Operations
+
+This older function is still available, but we
+recommend using the R6RS-compatible function.
+
 @deffn Procedure bit-extract n start end
 Equivalent to @code{(bitwise-bit-field @var{n} @var{start} @var{end})}.
 @end deffn

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] Was: Re: SRFI-60
  2014-02-22  8:04             ` Jamison Hope
@ 2014-02-26  7:13               ` Per Bothner
  0 siblings, 0 replies; 10+ messages in thread
From: Per Bothner @ 2014-02-26  7:13 UTC (permalink / raw)
  To: Jamison Hope, kawa@sourceware.org list

On 02/22/2014 12:04 AM, Jamison Hope wrote:
> On Feb 21, 2014, at 12:53 PM, Per Bothner <per@bothner.com> wrote:
>
>> We should also update the Logical-Number-Operations section.
> ...
> See attached.

Thanks - I checked this in.
-- 
	--Per Bothner
per@bothner.com   http://per.bothner.com/

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2014-02-26  7:13 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-02-18  6:53 SRFI-60 Jamison Hope
2014-02-18  7:12 ` SRFI-60 Per Bothner
2014-02-18 16:30   ` SRFI-60 Jamison Hope
2014-02-20  7:54     ` SRFI-60 Per Bothner
2014-02-20 13:47       ` SRFI-60 Jamison Hope
2014-02-20 13:51         ` [PATCH] Was: SRFI-60 Jamison Hope
2014-02-21 17:54           ` Per Bothner
2014-02-22  0:41             ` Jamison Hope
2014-02-22  8:04             ` Jamison Hope
2014-02-26  7:13               ` Per Bothner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).