From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Olivier Dion Newsgroups: gmane.lisp.guile.user Subject: [RFC PATCH 1/2] Add reader extension for interpolated strings. Date: Sat, 10 Dec 2022 17:17:23 -0500 Message-ID: <20221210221724.23998-2-olivier.dion@polymtl.ca> References: <20221210221724.23998-1-olivier.dion@polymtl.ca> Mime-Version: 1.0 Content-Transfer-Encoding: 8bit Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="36820"; mail-complaints-to="usenet@ciao.gmane.io" Cc: rekado@elephly.net, Olivier dion To: guile-user@gnu.org Original-X-From: guile-user-bounces+guile-user=m.gmane-mx.org@gnu.org Sat Dec 10 23:18:29 2022 Return-path: Envelope-to: guile-user@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1p48Au-0009Gu-8U for guile-user@m.gmane-mx.org; Sat, 10 Dec 2022 23:18:28 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p48AT-0007gf-5L; Sat, 10 Dec 2022 17:18:01 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p48AR-0007fR-B8 for guile-user@gnu.org; Sat, 10 Dec 2022 17:17:59 -0500 Original-Received: from smtp.polymtl.ca ([132.207.4.11]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p48AO-0000WI-Cg for guile-user@gnu.org; Sat, 10 Dec 2022 17:17:58 -0500 Original-Received: from laura.ht.home (modemcable094.169-200-24.mc.videotron.ca [24.200.169.94]) (authenticated bits=0) by smtp.polymtl.ca (8.14.7/8.14.7) with ESMTP id 2BAMHc9U021592 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT); Sat, 10 Dec 2022 17:17:47 -0500 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp.polymtl.ca 2BAMHc9U021592 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=polymtl.ca; s=default; t=1670710668; bh=lcMcaXxeAIEmbIoIkVfbKj+vKKoCL5ySE6C5u9FRkZ4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MnsBzTWZg6vYYO85vsyA3u/ZWehC1/sSqIiEiIFNKeM7MfqZs+CsmUrlWOQrSMXgO zaLbk8H0R3mx+/4rfrIDZmCseQX/wgsVYaZLtuAqBSxxiVY1Tvw8a76/421m9qHFz5 tHgS3q65CvzTpE/2+/P3BY0Q1NgoL+NutwaJ/Y14= X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221210221724.23998-1-olivier.dion@polymtl.ca> X-Poly-FromMTA: (modemcable094.169-200-24.mc.videotron.ca [24.200.169.94]) at Sat, 10 Dec 2022 22:17:38 +0000 Received-SPF: pass client-ip=132.207.4.11; envelope-from=olivier.dion@polymtl.ca; helo=smtp.polymtl.ca X-Spam_score_int: -43 X-Spam_score: -4.4 X-Spam_bar: ---- X-Spam_report: (-4.4 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_MED=-2.3, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: guile-user@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: General Guile related discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guile-user-bounces+guile-user=m.gmane-mx.org@gnu.org Original-Sender: guile-user-bounces+guile-user=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.lisp.guile.user:18770 Archived-At: From: Olivier dion Interpolate strings of the form #"The string @(eval this)". When no interpolation is required, simply return the raw string. For example, #"foo" will return "foo". When interpolation is required, return an expression that format the string with the embedded expressions withing it. For example #"1+1=@(+ 1 1)" will return (format #f "1+1=~a" (+ 1 1)). * module/ice-9/boot-9.scm: Extend read hash for strings interpolation. --- module/ice-9/boot-9.scm | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/module/ice-9/boot-9.scm b/module/ice-9/boot-9.scm index a46145ed5..5c0f2eef2 100644 --- a/module/ice-9/boot-9.scm +++ b/module/ice-9/boot-9.scm @@ -2254,6 +2254,43 @@ name extensions listed in %load-extensions." (error "#. read expansion found and read-eval? is #f.")))) + +(letrec ((interpolate + (lambda (port chars exps) + (let ((char (read-char port))) + (cond + ((eof-object? char) + (values + (reverse-list->string chars) + (reverse exps))) + ((char=? char #\@) + (let ((ahead (peek-char port))) + (cond + ((eof-object? ahead) + (interpolate port chars exps)) + ((char=? ahead #\@) + (read-char port) + (interpolate port + (cons #\@ chars) + exps)) + (else + (interpolate port + (cons #\a (cons #\~ chars)) + (cons (read port) exps)))))) + (else + (interpolate port (cons char chars) exps))))))) + (read-hash-extend #\" + (lambda (char port) + (unread-char char port) + (call-with-values + (lambda () (call-with-input-string (read port) + (lambda (port) + (interpolate port '() '())))) + (lambda (fmt args) + (if (null? args) + fmt + `(format #f ,fmt ,@args))))))) + ;;; {Low Level Modules} -- 2.38.1