From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: "Chris K. Jester-Young" Newsgroups: gmane.lisp.guile.devel Subject: Record type printers for SRFI 45 promises and SRFI 41 streams Date: Sun, 7 Apr 2013 12:49:35 -0400 Message-ID: <20130407164935.GA22923@lotus.destinee.acro.gen.nz> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="bg08WKrSYDhXBjb5" X-Trace: ger.gmane.org 1365353473 5662 80.91.229.3 (7 Apr 2013 16:51:13 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sun, 7 Apr 2013 16:51:13 +0000 (UTC) To: guile-devel@gnu.org Original-X-From: guile-devel-bounces+guile-devel=m.gmane.org@gnu.org Sun Apr 07 18:51:14 2013 Return-path: Envelope-to: guile-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1UOso8-00068S-Tm for guile-devel@m.gmane.org; Sun, 07 Apr 2013 18:51:09 +0200 Original-Received: from localhost ([::1]:42860 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UOso8-0001pD-Gu for guile-devel@m.gmane.org; Sun, 07 Apr 2013 12:51:08 -0400 Original-Received: from eggs.gnu.org ([208.118.235.92]:33573) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UOso1-0001oE-PN for guile-devel@gnu.org; Sun, 07 Apr 2013 12:51:03 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UOsnz-0000cW-Gu for guile-devel@gnu.org; Sun, 07 Apr 2013 12:51:01 -0400 Original-Received: from mail-yh0-x236.google.com ([2607:f8b0:4002:c01::236]:40984) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UOsnz-0000c9-B3 for guile-devel@gnu.org; Sun, 07 Apr 2013 12:50:59 -0400 Original-Received: by mail-yh0-f54.google.com with SMTP id 29so810873yhr.41 for ; Sun, 07 Apr 2013 09:50:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:date:from:to:subject:message-id:mail-followup-to :mime-version:content-type:content-disposition:user-agent; bh=4ldlyAQiMpdUAJMwUB7TimfJBl85C9dOCqoI98iLFTY=; b=fGLJ5jDJ9bXhSsuqh8ycS5Ew/DrS7IZDl6xqNu4N3r+ONgQmIJFQmwnhgAUUYqyggG R0yDMWVOreQ02j1AyFCNVwjlBs66ABise6OjVSlnGQjZ7iHZy3v1xmiltlsHVnbQpAB/ mu2yQG7aHeW4dhUSZ39DBq2Vq2A/J/Z75ErNEbiWnopq5AsTJXS55GR3stvPav2bLQby f+mjYEZOcHGldSUksHI5YeTtm7S7QA1LLmykGnxENoiut4M/lAD+CsKo/JiwhvESPjx8 jkii/ZEaNhbe3nzueRa5lFRhiPHJBwd1d5va1SjmKQg7NguPeULPMV14yiA9RLe/Cf1v K3xw== X-Received: by 10.236.158.1 with SMTP id p1mr10309663yhk.154.1365353458260; Sun, 07 Apr 2013 09:50:58 -0700 (PDT) Original-Received: from lotus.destinee.acro.gen.nz (cpe-107-015-120-110.nc.res.rr.com. [107.15.120.110]) by mx.google.com with ESMTPS id x71sm32977304yhg.17.2013.04.07.09.50.56 (version=TLSv1 cipher=RC4-SHA bits=128/128); Sun, 07 Apr 2013 09:50:57 -0700 (PDT) Mail-Followup-To: guile-devel@gnu.org Content-Disposition: inline User-Agent: Mutt/1.5.20 (2009-06-14) X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2607:f8b0:4002:c01::236 X-BeenThere: guile-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Developers list for Guile, the GNU extensibility library" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guile-devel-bounces+guile-devel=m.gmane.org@gnu.org Original-Sender: guile-devel-bounces+guile-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.lisp.guile.devel:16191 Archived-At: --bg08WKrSYDhXBjb5 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi all, I've attached record type printers for SRFI 45 promises and SRFI 41 streams. I've tried to make promise-visit more self-documenting with the use of keyword arguments; let me know if you think that's an improvement! Also as discussed with Mark H Weaver, I've currently implemented the format for promises as # ...> for unevaluated promises, and # for evaluated ones. Hopefully this is is easy to read and will clearly distinguish between the two types, and still look different from core promises too. Comments are most welcome! Thanks, Chris. --bg08WKrSYDhXBjb5 Content-Type: message/rfc822 Content-Disposition: inline; filename="0001-Add-record-type-printer-for-srfi-45.patch" From: Chris K. Jester-Young Date: Sun, 7 Apr 2013 12:43:17 -0400 Subject: [PATCH 1/2] Add record type printer for srfi-45. * module/srfi/srfi-45.scm: Add record type printer for promises. (promise-visit): New helper for visiting lazy promises. --- module/srfi/srfi-45.scm | 17 ++++++++++++++++- 1 files changed, 16 insertions(+), 1 deletions(-) diff --git a/module/srfi/srfi-45.scm b/module/srfi/srfi-45.scm index 5194770..6f7ba7e 100644 --- a/module/srfi/srfi-45.scm +++ b/module/srfi/srfi-45.scm @@ -39,7 +39,8 @@ eager promise?) #:replace (delay force promise?) - #:use-module (srfi srfi-9)) + #:use-module (srfi srfi-9) + #:use-module (srfi srfi-9 gnu)) (cond-expand-provide (current-module) '(srfi-45)) @@ -76,3 +77,17 @@ ;; (*) These two lines re-fetch and check the original promise in case ;; the first line of the let* caused it to be forced. For an example ;; where this happens, see reentrancy test 3 below. + +(define* (promise-visit promise #:key on-eager on-lazy) + (define content (promise-val promise)) + (case (value-tag content) + ((eager) (on-eager (value-proc content))) + ((lazy) (on-lazy (value-proc content))))) + +(set-record-type-printer! promise + (lambda (promise port) + (promise-visit promise + #:on-eager (lambda (value) + (format port "#" value)) + #:on-lazy (lambda (proc) + (format port "# ~s>" proc))))) -- 1.7.2.5 --bg08WKrSYDhXBjb5 Content-Type: message/rfc822 Content-Disposition: inline; filename="0002-Add-record-type-printer-for-srfi-41.patch" From: Chris K. Jester-Young Date: Sun, 7 Apr 2013 12:44:18 -0400 Subject: [PATCH 2/2] Add record type printer for srfi-41. * module/srfi/srfi-41.scm: Add record type printer for streams. (stream-promise-visit): New helper for visiting stream promises. --- module/srfi/srfi-41.scm | 23 +++++++++++++++++++++++ 1 files changed, 23 insertions(+), 0 deletions(-) diff --git a/module/srfi/srfi-41.scm b/module/srfi/srfi-41.scm index 6f73ce3..3589b35 100644 --- a/module/srfi/srfi-41.scm +++ b/module/srfi/srfi-41.scm @@ -27,6 +27,7 @@ #:use-module (srfi srfi-1) #:use-module (srfi srfi-8) #:use-module (srfi srfi-9) + #:use-module (srfi srfi-9 gnu) #:use-module (srfi srfi-26) #:use-module (ice-9 match) #:export (stream-null stream-cons stream? stream-null? stream-pair? @@ -180,6 +181,28 @@ (define-syntax-rule (stream-lambda formals body0 body1 ...) (lambda formals (stream-lazy (begin body0 body1 ...)))) +(define* (stream-promise-visit promise #:key on-eager on-lazy) + (define content (stream-promise-val promise)) + (case (stream-value-tag content) + ((eager) (on-eager (stream-value-proc content))) + ((lazy) (on-lazy (stream-value-proc content))))) + +(set-record-type-printer! stream-promise + (lambda (strm port) + (display "# port)) + (else + (write-char #\space port) + (stream-promise-visit (stream-kar pare) + #:on-eager (cut write <> port) + #:on-lazy (lambda (_) (write-char #\? port))) + (loop (stream-kdr pare))))) + #:on-lazy (lambda (_) (display " ...>" port)))))) + ;;; Derived stream functions and macros: (streams derived) (define-syntax-rule (define-stream (name . formal) body0 body1 ...) -- 1.7.2.5 --bg08WKrSYDhXBjb5--