From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Ted Zlatanov Newsgroups: gmane.emacs.devel Subject: Re: RFC: String interpolation Date: Sat, 10 Dec 2016 21:53:59 -0500 Organization: =?utf-8?B?0KLQtdC+0LTQvtGAINCX0LvQsNGC0LDQvdC+0LI=?= @ Cienfuegos Message-ID: <87wpf7kwfs.fsf@lifelogs.com> References: <51825111-ace4-f750-4077-026a3b648d27@gmail.com> <8737hwnc52.fsf@lifelogs.com> Reply-To: emacs-devel@gnu.org NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: blaine.gmane.org 1481424865 8596 195.159.176.226 (11 Dec 2016 02:54:25 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Sun, 11 Dec 2016 02:54:25 +0000 (UTC) User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.0.50 (gnu/linux) To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sun Dec 11 03:54:21 2016 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cFuHL-0001CZ-L3 for ged-emacs-devel@m.gmane.org; Sun, 11 Dec 2016 03:54:19 +0100 Original-Received: from localhost ([::1]:53912 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cFuHP-00018l-U4 for ged-emacs-devel@m.gmane.org; Sat, 10 Dec 2016 21:54:23 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:56292) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cFuHJ-00018d-U5 for emacs-devel@gnu.org; Sat, 10 Dec 2016 21:54:19 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cFuHF-0006Kf-0Z for emacs-devel@gnu.org; Sat, 10 Dec 2016 21:54:17 -0500 Original-Received: from [195.159.176.226] (port=34108 helo=blaine.gmane.org) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1cFuHE-0006KK-Oi for emacs-devel@gnu.org; Sat, 10 Dec 2016 21:54:12 -0500 Original-Received: from list by blaine.gmane.org with local (Exim 4.84_2) (envelope-from ) id 1cFuH5-0007GV-M4 for emacs-devel@gnu.org; Sun, 11 Dec 2016 03:54:03 +0100 X-Injected-Via-Gmane: http://gmane.org/ Mail-Followup-To: emacs-devel@gnu.org Original-Lines: 66 Original-X-Complaints-To: usenet@blaine.gmane.org X-Face: bd.DQ~'29fIs`T_%O%C\g%6jW)yi[zuz6; d4V0`@y-~$#3P_Ng{@m+e4o<4P'#(_GJQ%TT= D}[Ep*b!\e,fBZ'j_+#"Ps?s2!4H2-Y"sx" Mail-Copies-To: never Cancel-Lock: sha1:/y6yQMHsKQyUnhYIss+bktDiQPo= X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 195.159.176.226 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.org gmane.emacs.devel:210254 Archived-At: On Fri, 9 Dec 2016 17:45:16 -0500 Clément Pit--Claudel wrote: CP> On 2016-12-09 14:19, Ted Zlatanov wrote: >> On Wed, 7 Dec 2016 20:13:41 -0500 Clément Pit--Claudel wrote: >> I'd rather see either something like Mustache templates or simply using >> the format-spec.el that comes with Emacs. The advantage in my opinion >> (informed by many years of using Perl, where string interpolation is a >> way of life) is that clarity is improved by separating the format spec >> from the data that fills it out, and it's very tempting to stuff logic >> into strings but maintenance is unpleasant. CP> Thanks for the feedback! Can you share concrete examples in which CP> this makes maintenance harder? Just imagine *any* Perl code "@{[ inside here ]}" and you're ready. Things like embedded hash slices, in-place sorts or Schwarzian transforms... (let ((a 12) (b 15)) (format-spec "%a + %b = %u" (format-spec-make ?a a ?b b ?u (+ a b))) CP> Thanks. Are there benefits of this over just (format "%s + %s = %s" a b (+ a CP> b))? The names ?a and ?b seem redundant, and ?u doesn't carry specific meaning. Yes, of course. It's the same as positional vs. named arguments to functions. In (format "%s %s %s" x y z) you have to remember each parameter, and if you want to repeat x twice you have to write it two times. To take a step back, imagine a spectrum. At one end is (format "%s %s %s" ...) which is fast, easy to implement, familiar to those who know sprintf, and anonymizes the template data, filtering it through a type expression. This is extremely popular and is not going away. The middle of the spectrum are things like Mustache {{ foo }} and `format-spec' which separate the format from the data but have an alias for each data item. And at the other end we see your approach and Ansible+Jinja and Perl etc. which directly refer to the variables in scope and basically try to reinvent the language in a "portable" format that can be embedded in a string. If you're set on doing this, please just fall through to the underlying language, e.g. "$(format \"%3.2s\" myvar) $(myothervar)" CP> Also: how does format-spec deal with formatting sequences, like %-3.2d? It doesn't. You would convert that before passing it to the function. You can consider that a deficiency (if you prefer the printf style) or good (if you like the Mustache style). >> This one in particular is heading in the direction of the way Ansible >> integrates Jinja templates, which I think is not great compared to a >> more Lispy approach. CP> I have no strong feelings either way. I like the way Python is going, so it CP> feels natural to suggest the same direction for Emacs. I view it as a convenient CP> DSL for producing strings, just like the loop macro is a good DSL for iterating CP> and accumulating results — and we're a Lisp, so we're good at DSLs :) I think it's good to experiment. As currently proposed, I wouldn't want to *maintain* code that used your approach. But I could be wrong about it, and my advice was based on personal intuition and experience. So I hope you found it useful rather than discouraging :) Ted