From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Jean Abou Samra Newsgroups: gmane.lisp.guile.user Subject: Re: Understanding `symbol??` macro from okmij.org Date: Thu, 14 Mar 2024 02:01:56 +0100 Message-ID: <203e78caa171357240ae6c296d4e4d765ec7446d.camel@abou-samra.fr> References: <9142ff20-0722-4fb7-b35a-7434e68d1777@posteo.de> Mime-Version: 1.0 Content-Type: multipart/signed; micalg="pgp-sha512"; protocol="application/pgp-signature"; boundary="=-Uq8QwljusUakr+ozGfgT" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="38980"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Evolution 3.50.4 (3.50.4-1.fc39) To: Zelphir Kaltstahl , Guile User Original-X-From: guile-user-bounces+guile-user=m.gmane-mx.org@gnu.org Thu Mar 14 02:02:34 2024 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 1rkZUQ-0009vv-1m for guile-user@m.gmane-mx.org; Thu, 14 Mar 2024 02:02:34 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rkZTx-0003J3-9z; Wed, 13 Mar 2024 21:02:05 -0400 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 1rkZTv-0003Iq-EL for guile-user@gnu.org; Wed, 13 Mar 2024 21:02:03 -0400 Original-Received: from mout.kundenserver.de ([212.227.17.13]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rkZTt-0007T4-LT for guile-user@gnu.org; Wed, 13 Mar 2024 21:02:03 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=abou-samra.fr; s=s1-ionos; t=1710378117; x=1710982917; i=jean@abou-samra.fr; bh=sGadYD+jLPraKUGBxblVRIDO+bt86yrdDutvBDsHdic=; h=X-UI-Sender-Class:Subject:From:To:Date:In-Reply-To:References; b=amyKVzUpz29KGriZguydKUCZXk+0Gy6KA4QJrPI/qEvgnRwzKcFYZP9/UNQ9k9Kb 6zxLda8eOLCc2xaT9RjUfzWMkJ04FM/TWGz1j+5jsjzTqao8JtIlaqt+Pu67/CFiI Kvdi7ujgG0Mhr261bZjcI3IOdxF6U9u+kEClGce4MnvBtcCQd3W9gIqWT07V/jvyg UJOxegwteo85WZYgXRGNJzCyeGTm3AC+0/OjHGnt0S54HMe8H2Ok0Ps1gVhOyzKb4 pfeAcIEtBLvoGYffTNiDTrLQRAvWH6JqE0ld7mv9vD3v3vVZC3MnTMKtKpMxBVx2U i8g5xKWZWLD8zVcnNg== X-UI-Sender-Class: 55c96926-9e95-11ee-ae09-1f7a4046a0f6 Original-Received: from [192.168.1.16] ([83.202.85.244]) by mrelayeu.kundenserver.de (mreue109 [213.165.67.119]) with ESMTPSA (Nemesis) id 1MOiLp-1rRXKc1k6x-00QBMu; Thu, 14 Mar 2024 02:01:57 +0100 In-Reply-To: <9142ff20-0722-4fb7-b35a-7434e68d1777@posteo.de> Autocrypt: addr=jean@abou-samra.fr; prefer-encrypt=mutual; keydata=mDMEYz8qHRYJKwYBBAHaRw8BAQdAKa699V3Pc3AOAg40hnai7Ljs1uAOxkeopSA7uz+TN/q0JEplYW4gQWJvdSBTYW1yYSA8amVhbkBhYm91LXNhbXJhLmZyPoiTBBMWCgA7FiEEme0ysZyhsgbwY8wZo/D2C4kzl/4FAmM/Kh0CGwMFCwkIBwICIgIGFQoJCAsCBBYCAwECHgcCF4AACgkQo/D2C4kzl/5MjQEAzHgLjZqtPK4nM5d4a+c03tUmYTKsGnfiHYPbSwD7V2cA/1kL/iF8C8wN/K//1+8vRd4iuv1jrPbpLv11LHWg+EkMuDgEYz8qHRIKKwYBBAGXVQEFAQEHQH0iBXUPzOJuyB2BtsqYTFqM4MLa6EuVsLfeIWGHqFQIAwEIB4h4BBgWCgAgFiEEme0ysZyhsgbwY8wZo/D2C4kzl/4FAmM/Kh0CGwwACgkQo/D2C4kzl/6AtAEAvKhPZXuZ3WuuantJJ3VBeknOn0oPSqt24zFFseobJ3IA/jGs23lNR8StTl5KMvvqSLfSCWr1wO8xFkneQbwWliIF X-Provags-ID: V03:K1:TG/EBO/2ZRrk7WF2YYJShcpZqjqUCDlPdJZ7wXhMGaqMaWtEm0E 1gQCKRbfCULD3FkhZr71BRLZdtyJOzC272HLhO41mJfpDLNg+J8FR0Po+1O62nPmz889YNc 2xjNT7fwRrGk5W6Q4ydeYRNwbQdkGK1XE5dfm5RbORjzQ8T4sPOWW5AEDJgHuNc9VXIzgS4 GiEa6n7hU1GL1O57nQVFg== UI-OutboundReport: notjunk:1;M01:P0:7/WXhLRWqzI=;IVOo3NtFGforvffg0I4Dcpf2QbW q8Ni2PrUYw/mIHV14Ubux5iHF+us3RpzJRua05nA9qU2EBo07Zz+gZn7TQwG5EwRKAjMUSaCT X1y7tzk68xgl0VGdJrDNOTqkI2+vcpsNIvwHC4mcc9Y8w5jtXaliVprLy+3OmXQj+aGMlmhPS /L6Ose/uyLfMz0oCjLVmueL5wcKlyH6JD5Ync0/nG3qCpbso2TEYFi+I9ZEAw8GpmQq8YYc4G ck6og9BQ8GdFnyGzY65/24ysCwjaoZwKcIjqnguKgHAJ4IVOAcwx6lDuZ0kFcAyCf3hb0y+00 NgPIISGCSlJTWIAzZysjo7CTsicMYoIChtJH2M4xUnl/Gve+7myxTlSZhBxxIAvvzLcHN++Jg k2ObVY3gUj1FS7qwdBXhoXalt4XtuvdHC0A4zrNek7whZOREAajcH2YvhzaRdCbQ5XaeIzzGA fMgPDj84VrJOcrQzWvROGPrvdQKbV2tWdyWQv5InNMnJOCYSLMN32AdyY/jJphjkbKQ5EQMDI WyMV+VE7eWJHpFWsLXGRXRz+7FNxOIb7u++LT96NWfBMauQWcC6z/5P1FCw5kDgo/gYJ2bM12 edI+mVUecaZ9geZZq9cNYQjKQq+Q0tk0ZT+WYkpmt8KlIfPVOLUZOcuxw2o6bvi1Z2taZvKow /JTpQASngeM1xxhif5DlBP9YoQP1igqbKd72MorilOdqKkpPRXEtQX5lsOJssel/BGLDfnXMz PB+hKy0y2rtBYNQJxg0ISstoriByauOW8o6GQjDXsqQBQuchBdSUdQ= Received-SPF: pass client-ip=212.227.17.13; envelope-from=jean@abou-samra.fr; helo=mout.kundenserver.de X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 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_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 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:19460 Archived-At: --=-Uq8QwljusUakr+ozGfgT Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi! The explanations are on https://okmij.org/ftp/Scheme/macros.html#macro-symbol-p Maybe this version will be easier to understand (we don't really need continuation-passing style here): (define-syntax symbol?? (syntax-rules () ((symbol?? maybe-symbol) (let-syntax ((test (syntax-rules () ((test maybe-symbol) #t) ((test _) #f)))) (test abracadabra))))) (symbol?? foo) =E2=87=92 #t (symbol?? (a . b)) =E2=87=92 #f (symbol?? 5) =E2=87=92 #f (symbol?? "a") =E2=87=92 #f (symbol?? #(1 a)) =E2=87=92 #f Basically: the macro call (symbol?? ) expands to a macro definition of test as (syntax-rules () =C2=A0 ((test ) #t) ((test _) #f)) and a call (test abracadabra). Now, observe that if is a symbol, then it's a catch-all pattern when inserted in the syntax-rules definition of `test`, so it will match abracadabra (because it matches anything). On the other hand, if it's not a symbol, then it won't match abracadabra, by case analysis: if it's a number it will only match that number; booleans, strings and characters likewise; if it's a pair it can only match pairs; if it's a vector it can only match vectors; etc. I'm not exactly sure why Oleg Kiselyov included special cases for a pair and a vector, but my guess is that not all Scheme implementations support vectors in syntax-rules patterns (and the pair check is necessary because the car or cdr could contain a vector). The Scheme standards certainly have their opinion on this, and I knew that stuff by heart at some point (when I implemented a syntax-rules/syntax-case expander for a university project), but I don't remember, and it's too late for scouring the standards... Best, Jean --=-Uq8QwljusUakr+ozGfgT Content-Type: application/pgp-signature; name="signature.asc" Content-Description: This is a digitally signed message part -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQSZ7TKxnKGyBvBjzBmj8PYLiTOX/gUCZfJMhAAKCRCj8PYLiTOX /oEvAQChE3y8JlJGKiMt0gHuKO/BQ6majWXYMZ/kCOc3BngLcwD/UMOusKLpJJaq IWjhun5fgfKud8gFU2EVdV3BO8fmGQY= =6qGy -----END PGP SIGNATURE----- --=-Uq8QwljusUakr+ozGfgT--