Topic: Rough Draft Proposal of Interpolated String Literals
Author: Andrew Tomazos <andrewtomazos@gmail.com>
Date: Fri, 18 Sep 2015 22:21:58 +0200
Raw View
--047d7b624e9aa410da05200b4883
Content-Type: multipart/alternative; boundary=047d7b624e9aa410d405200b4881
--047d7b624e9aa410d405200b4881
Content-Type: text/plain; charset=UTF-8
Please find attached a very very rough draft of a proposal entitled
"Interpolated String Literals".
Mainly after encouragement or discouragement, and any high-level thoughts
you might have about it.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
--047d7b624e9aa410d405200b4881
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">Please find attached a very very rough draft of a proposal=
entitled "Interpolated String Literals".<div><br></div><div>Main=
ly after encouragement or discouragement, and any high-level thoughts you m=
ight have about it.</div><div><br></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--047d7b624e9aa410d405200b4881--
--047d7b624e9aa410da05200b4883
Content-Type: application/pdf; name="InterpolatedStringLiterals.pdf"
Content-Disposition: attachment; filename="InterpolatedStringLiterals.pdf"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_ieq2scv30
JVBERi0xLjQKJb/3ov4KMzIgMCBvYmoKPDwgL0xpbmVhcml6ZWQgMSAvTCAyMDUxNDAgL0ggWyA4
NTUgMjg2IF0gL08gMzUgL0UgNzg1NTQgL04gOCAvVCAyMDQzODEgPj4KZW5kb2JqCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKeHJlZgozMiAyMQow
MDAwMDAwMDE1IDAwMDAwIG4gCjAwMDAwMDA4MDQgMDAwMDAgbiAKMDAwMDAwMDg1NSAwMDAwMCBu
IAowMDAwMDAxMTQxIDAwMDAwIG4gCjAwMDAwMDE1MzcgMDAwMDAgbiAKMDAwMDAxMTg4NCAwMDAw
MCBuIAowMDAwMDExOTgwIDAwMDAwIG4gCjAwMDAwMTIxMTcgMDAwMDAgbiAKMDAwMDAxMjI1NCAw
MDAwMCBuIAowMDAwMDEyMzk4IDAwMDAwIG4gCjAwMDAwMTMxNjYgMDAwMDAgbiAKMDAwMDAxMzU5
MSAwMDAwMCBuIAowMDAwMDEzODA0IDAwMDAwIG4gCjAwMDAwMTQwOTkgMDAwMDAgbiAKMDAwMDAx
NDMyNCAwMDAwMCBuIAowMDAwMDE0NzY2IDAwMDAwIG4gCjAwMDAwMTQ5OTUgMDAwMDAgbiAKMDAw
MDA0MTY2NCAwMDAwMCBuIAowMDAwMDQxODg5IDAwMDAwIG4gCjAwMDAwNDgxODQgMDAwMDAgbiAK
MDAwMDA0ODQxMiAwMDAwMCBuIAp0cmFpbGVyIDw8IC9Sb290IDMzIDAgUiAvU2l6ZSA1MyAvUHJl
diAyMDQzNzIgICAgICAgICAgICAgICAgL0lEIFs8MzE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4
MzI3OTU+PDMxNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1Pl0gPj4Kc3RhcnR4cmVmCjAK
JSVFT0YKMzMgMCBvYmoKPDwgL1BhZ2VzIDMxIDAgUiAvVHlwZSAvQ2F0YWxvZyA+PgplbmRvYmoK
MzQgMCBvYmoKPDwgL0ZpbHRlciAvRmxhdGVEZWNvZGUgL1MgMTU1IC9MZW5ndGggMjA2ID4+CnN0
cmVhbQp4nGNgYGBiYGAOZ2BlYGALYhBkgAIwmxUkysDS6AAkp3DOqnI5qfQ8UbrgkILRE6Cwbuza
bIETwbKcQTeu2wlOeZ3zwlnRp0TVOznmh9v0Yz8UJyyzElq6cV2NsualbfuM136Ay7o4a/Yt3bih
oy1Y1js5UZBnmdW0Y4cUMCwAAhEGpi4uIC0ExLJgkQQGfqaIBTpAV09gVeBhDGD0ZHjFLMPCIbpA
YOdnB4cZ5oycVysYFJgDWA8oNkxsVGKSYFLTP8GxI2sBSDcAIC9CPQplbmRzdHJlYW0KZW5kb2Jq
CjM1IDAgb2JqCjw8IC9Bbm5vdHMgWyA8PCAvQSA8PCAvUyAvVVJJIC9UeXBlIC9BY3Rpb24gL1VS
SSAobWFpbHRvOmFuZHJld3RvbWF6b3NAZ21haWwuY29tKSA+PiAvQm9yZGVyIFsgMCAwIDAgXSAv
UmVjdCBbIDIwNC43NSA2MzguMjUgMzQ1IDY1MSBdIC9TdWJ0eXBlIC9MaW5rIC9UeXBlIC9Bbm5v
dCA+PiBdIC9Db250ZW50cyAzNiAwIFIgL01lZGlhQm94IFsgMCAwIDYxMiA3OTIgXSAvUGFyZW50
IDMxIDAgUiAvUmVzb3VyY2VzIDw8IC9FeHRHU3RhdGUgPDwgL0cwIDM3IDAgUiA+PiAvRm9udCA8
PCAvRjAgMzggMCBSIC9GMSAzOSAwIFIgL0YyIDQwIDAgUiA+PiAvUHJvY1NldHMgWyAvUERGIC9U
ZXh0IC9JbWFnZUIgL0ltYWdlQyAvSW1hZ2VJIF0gPj4gL1R5cGUgL1BhZ2UgPj4KZW5kb2JqCjM2
IDAgb2JqCjw8IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlIC9MZW5ndGggMTAyNzMgPj4Kc3RyZWFtCnic
lX3rim1Jbub/eorzAt6O+wUGg7un2r9nKJgHGOwGgwdsvz+Mvsi91gqFtr7M6gNdhzzKWAqFQncp
4q8gf/4hyv/1mX793//47T9/w09aTOsH//Wvv/2fX/8PP3z1umDvvwhs/IU///tffn395b/+/ts/
/kv49ff/XkuM2H7FUBvW+Lf7J6OUoX+yw8y2fjRbeGACPvD1F/nAX/747R//Fn6l9mqt9V9//Ntv
8dqC/HKUxf/4j9/+Rwjpr//0649/f/4xhvwqYYeo8YCI45VymDtIP0BSfbXcdpAyDpASXqXFsa9S
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
4f3/JX/+P2++rj5lbmRzdHJlYW0KZW5kb2JqCjM3IDAgb2JqCjw8IC9CTSAvTm9ybWFsIC9DQSAx
IC9MQyAwIC9MSiAwIC9MVyAwIC9NTCA0IC9TQSB0cnVlIC9UeXBlIC9FeHRHU3RhdGUgL2NhIDEg
Pj4KZW5kb2JqCjM4IDAgb2JqCjw8IC9CYXNlRm9udCAvQXJpYWxNVCAvRGVzY2VuZGFudEZvbnRz
IFsgNDEgMCBSIF0gL0VuY29kaW5nIC9JZGVudGl0eS1IIC9TdWJ0eXBlIC9UeXBlMCAvVG9Vbmlj
b2RlIDQyIDAgUiAvVHlwZSAvRm9udCA+PgplbmRvYmoKMzkgMCBvYmoKPDwgL0Jhc2VGb250IC9H
YXV0YW1pIC9EZXNjZW5kYW50Rm9udHMgWyA0MyAwIFIgXSAvRW5jb2RpbmcgL0lkZW50aXR5LUgg
L1N1YnR5cGUgL1R5cGUwIC9Ub1VuaWNvZGUgNDQgMCBSIC9UeXBlIC9Gb250ID4+CmVuZG9iago0
MCAwIG9iago8PCAvQmFzZUZvbnQgL0NvdXJpZXJOZXdQU01UIC9EZXNjZW5kYW50Rm9udHMgWyA0
NSAwIFIgXSAvRW5jb2RpbmcgL0lkZW50aXR5LUggL1N1YnR5cGUgL1R5cGUwIC9Ub1VuaWNvZGUg
NDYgMCBSIC9UeXBlIC9Gb250ID4+CmVuZG9iago0MSAwIG9iago8PCAvQmFzZUZvbnQgL0FyaWFs
TVQgL0NJRFN5c3RlbUluZm8gPDwgL09yZGVyaW5nIChJZGVudGl0eSkgL1JlZ2lzdHJ5IChBZG9i
ZSkgL1N1cHBsZW1lbnQgMCA+PiAvQ0lEVG9HSURNYXAgL0lkZW50aXR5IC9Gb250RGVzY3JpcHRv
ciA0NyAwIFIgL1N1YnR5cGUgL0NJREZvbnRUeXBlMiAvVHlwZSAvRm9udCAvVyBbIDAgWyA3NTAg
MCAwIDI3Ny44MzIgXSA4IFsgODg5LjE2MDIgXSA5IDEzIDMzMy4wMDc4IDE0IFsgNTgzLjk4NDQg
Mjc3LjgzMiAzMzMuMDA3OCAyNzcuODMyIDI3Ny44MzIgXSAxOSAyOCA1NTYuMTUyMyAyOSBbIDI3
Ny44MzIgXSAzMCAzNCA1ODMuOTg0NCAzNSBbIDEwMTUuMTM2NyA2NjYuOTkyMiA2NjYuOTkyMiA3
MjIuMTY4IDcyMi4xNjggNjY2Ljk5MjIgNjEwLjgzOTggNzc3LjgzMiAwIDI3Ny44MzIgMCAwIDU1
Ni4xNTIzIDgzMy4wMDc4IDcyMi4xNjggNzc3LjgzMiA2NjYuOTkyMiAwIDAgNjY2Ljk5MjIgNjEw
LjgzOTggMCA2NjYuOTkyMiA5NDMuODQ3NyAwIDAgMCAyNzcuODMyIF0gNjMgNjkgNTU2LjE1MjMg
NzAgWyA1MDAgNTU2LjE1MjMgNTU2LjE1MjMgMjc3LjgzMiA1NTYuMTUyMyA1NTYuMTUyMyAyMjIu
MTY4IDIyMi4xNjggNTAwIDIyMi4xNjggODMzLjAwNzggXSA4MSA4NCA1NTYuMTUyMyA4NSBbIDMz
My4wMDc4IDUwMCAyNzcuODMyIDU1Ni4xNTIzIDUwMCA3MjIuMTY4IF0gOTEgOTMgNTAwIDk0IFsg
MzMzLjk4NDQgXSAxNzkgMTgwIDMzMy4wMDc4IDE4MSAxODIgMjIyLjE2OCBdID4+CmVuZG9iago0
MiAwIG9iago8PCAvRmlsdGVyIC9GbGF0ZURlY29kZSAvTGVuZ3RoIDM1MyA+PgpzdHJlYW0KeJxd
kk1ugzAQhfecwst2EWEbQhMJIQFpJBb9UdMegJghRSrGMmTB7Wv8aCLVEkjfG8/4jWbCsjpUuptY
+G4HdaKJtZ1uLI3D1SpiZ7p0OhCSNZ2aVvJ/1dcmCF3yaR4n6ivdDkGaMhZ+uOg42Zk95M1wpscg
fLMN2U5f2MNXeXJ8uhrzQz3pifEgy1hDrav0UpvXuicW+rRN1bh4N80bl3O/8TkbYtKzgBs1NDSa
WpGt9YWClLuTsfToThaQbv7FBUfauVXftfXXI3ed85xnnnae5NaT4IgdQIWnaAc6gHLQEVR6kgL0
DCo9xXtPTlxoW3iKJQhmV1d3k/em8DZHKQkLHKU43paoKPC22ENcLaBJmcMJepWrZ8RiWI8SiE/w
FUHc//XqxQTWYxBMJMKLBYoVS0xygZrFFmICcbf2iuaWGS27dFsAdbXWzd4vnB/6Mu5O020nzWCW
rOX7BYREuzNlbmRzdHJlYW0KZW5kb2JqCjQzIDAgb2JqCjw8IC9CYXNlRm9udCAvR2F1dGFtaSAv
Q0lEU3lzdGVtSW5mbyA8PCAvT3JkZXJpbmcgKElkZW50aXR5KSAvUmVnaXN0cnkgKEFkb2JlKSAv
U3VwcGxlbWVudCAwID4+IC9DSURUb0dJRE1hcCAvSWRlbnRpdHkgL0ZvbnREZXNjcmlwdG9yIDQ5
IDAgUiAvU3VidHlwZSAvQ0lERm9udFR5cGUyIC9UeXBlIC9Gb250IC9XIFsgMCBbIDUwMCBdIF0g
Pj4KZW5kb2JqCjQ0IDAgb2JqCjw8IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlIC9MZW5ndGggMjIzID4+
CnN0cmVhbQp4nF2QQWrEMAxF9z6FljOLwUnWIdBOKWTRaWnaAzi2khoa2SjOIrev7IYpVGCD/P8T
39LX/qknn0C/cbADJpg8OcY1bGwRRpw9qboB5206unLbxUSlBR72NeHS0xRU2wLod1HXxDucHlwY
8az0KztkTzOcPq+D9MMW4zcuSAkq1XXgcJJJLybezIKgC3bpneg+7Rdh/hwfe0RoSl//prHB4RqN
RTY0o2orqQ7aZ6lOIbl/+kGNk/0yXNy1uJuqeizu4z1z+X/3UHZjljxlCSVIjuAJ73uKIWYqnx9E
+W9JZW5kc3RyZWFtCmVuZG9iago0NSAwIG9iago8PCAvQmFzZUZvbnQgL0NvdXJpZXJOZXdQU01U
IC9DSURTeXN0ZW1JbmZvIDw8IC9PcmRlcmluZyAoSWRlbnRpdHkpIC9SZWdpc3RyeSAoQWRvYmUp
IC9TdXBwbGVtZW50IDAgPj4gL0NJRFRvR0lETWFwIC9JZGVudGl0eSAvRm9udERlc2NyaXB0b3Ig
NTEgMCBSIC9TdWJ0eXBlIC9DSURGb250VHlwZTIgL1R5cGUgL0ZvbnQgL1cgWyAwIFsgNjAwLjA5
NzcgXSBdID4+CmVuZG9iago0NiAwIG9iago8PCAvRmlsdGVyIC9GbGF0ZURlY29kZSAvTGVuZ3Ro
IDM3MCA+PgpzdHJlYW0KeJxdkk1ugzAQhfecwst2EWEDIY2EkAIJUhb9UWkPQGBIkYpBhixy+9rz
QiIVCaxvPM8zz4yfH/dH3c3C/zBDXdIs2k43hqbhYmoSJzp32lOBaLp6vhF/674aPd+Ky+s0U3/U
7eAliRD+p92dZnMVT7tmONGz57+bhkynz+LpOy8tl5dx/KWe9Cykl6aiodae9FqNb1VPwmfZ6tjY
/W6+rqzmkfF1HUkEzArd1END01jVZCp9Ji+R9klFUtgn9Ug3//atE5ad2vqnMpwe2nQpdzJ1pCRo
Dzo4CjcHpgCZETKDGBSCtqAYlIO2TGHGtH5higJQwRSj3gb1di4zcEc7ymImtWUjt46VXAw8DEd8
hkQLgWKxRFFZIIjaSjGpPYKwpYpF55YwhwMEQ7QXIRiuEdzAQYDgYbkVDmYwGS06t8RoKULmGkuM
zAyXmkXwmt+8wpz7f27O7sNRX4yxc8HDyAPhRqHTdJ/XcRidyr1/WETAnmVuZHN0cmVhbQplbmRv
YmoKNDcgMCBvYmoKPDwgL0FzY2VudCA5MDUuMjczNCAvQ2FwSGVpZ2h0IDcxNS44MjAzIC9EZXNj
ZW50IC0yMTEuOTE0MSAvRmxhZ3MgNCAvRm9udEJCb3ggWyAtNjY0LjU1MDggLTMyNC43MDcgMjAy
OC4zMjAzIDEwMzcuMTA5NCBdIC9Gb250RmlsZTIgNDggMCBSIC9Gb250TmFtZSAvQXJpYWxNVCAv
SXRhbGljQW5nbGUgMCAvU3RlbVYgODcuODkwNiAvVHlwZSAvRm9udERlc2NyaXB0b3IgPj4KZW5k
b2JqCjQ4IDAgb2JqCjw8IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlIC9MZW5ndGgxIDQ3ODcyIC9MZW5n
dGggMjY1ODAgPj4Kc3RyZWFtCnic7Lx3fFRF9z9+Zu7c7T272c1msyWb3ZAESEghBCJZIKFICz1B
IqE3kRJARYEgPYBgAQGVZqPKEoohoKBiAUVsYAEBFewIKmJJsvs7c3eDwOPneZ7f9/f9/fH9vsjm
fc/UOzNnTpt7NwECAGqoBAEyho0fMnHU7u7LACyfAMQ8NGzaFPfKiR9MA2htA5BljJw4avw9yZt/
A0gZDSAGR91130h97fhBAH1/BOhKR48YMvxo3tXleMcDiJajscA03rgF01cQSaPHT7n36MaKAABp
BWBef9eEYUPIhEvvAQQ6Y/6Z8UPunah8V/Mo1uN44L57yPgRr5BR+QDrLgPEaydOHjHxh+2TvgRI
x3pVA/C50/d/vH/++dWD9fm/KeIVwH82fpWcyume26rf+mtHwyhDa0U3zCqxPZEa4FXeNtQDOhjg
rx2hLEPraPm1H7EJLxGb4KUAhoEIFAyQDu0BmAbHFYDKol1o3jUE6cdwJ6sAC6KLPAHuEftDCVkA
A+kWeIBDSIAA2waTse0WzLdDWsv7Yvt+iLOIfER/hD1a1h0xBNGH57HtPt4X7zGR30eiFTBQ4YIJ
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
7yIGoq94FzKQ9kHarpFek++ovbhB5ntF5P1antuSCze1+Vsn/taN49zX/PM9/28C6s5RxJuIN/7/
HotbGW4jDNxOnMY4pADjyBMYn9wBcwAa0JbUpyOeQzvUF+nHWIbeO5SC0GLaiGWjkD4FUPcbpidj
+YkIwpTFw/poXBmHZXujfRXR+/WJ9K97C+AvlKi/dkT6121BjMX0z4gZmP4c6StIV2H777HfXKSv
RuobBmN+GuIA5n/A/F2IEkwvR2pB2hQRgzBh/5UcPB75l3Po/3b6z+eP/5ZizDIM5+niz7yQPnDz
GeK/po37+R/ozWeNxv3/T/S6ZwY30Qgf8Mz0JcZ9wevPPv/ujNNIcT9D14P1CzdgTKnhcTSPZXn8
LMWPUSqd36Q4FscFMDdSHjvz+JXHzjx+RboB6UKZKM2nHz/n83mB5FIkOCSFAGVvzGFKVQJM2ZI/
g+WPQaEVzCSzyDLyCNlAguQ0CdNS+iY9Qj8XiCAISsErzBSqhCXCBuFdpmE92SA2mD3KHmdPsafZ
Lraffcq+E/eJr4nfi1dkGlm8zCVrLestGycbL5skmymbL1sle0a2WbZD9o7shOxP5zznn2692+J2
uhPdfndzd4Y7y93ane9u6y50T3DPcj/jft69zSN6YjyxnkSP39Pc09dzp2eFZ1MiTZQl6hNNiZZE
e6IrMSUxLbFz4pDEEV7qNXg9PvBRn8Zn8Jl9Np/Dl+Rr6sv25fvu8lX65voW+pb4HvVt8G3zVftq
fQd8h31v+477PvV97c/3B/zt/eX+Yf6R/nHfit/avm19mV5uUUfr3HUt6/Lr2ta1qyus61lXWjej
bnHdirpw/dCGgoZfQvXh+nCYP6GG9RLn1pMd5Bj5Czn3BnLuEwGucW4ucu4h4WlGmI71Yney5Wwl
W8M2shdYDfuEfSsGxf3ie+LlKOc8soCs/B85d9lZ6Vzv1rhj3Fa3GzmXipzLdOdFOTcWOfc0cm7L
DZzr47nDs/wa54zIubhEZ5Rz5YnDJc65/wfOFV/j3HLfet+Wa5w7ipz7BDnX+hrnRvjHfkskzpHL
rI4g51LrWiHnAnUd6jrW9a+bXldV91Bdff2dDW2Rc5Wcc+GvUDBXhM30KH1JSA+fpu+gRuhRIh8h
95BxZHL9esyP4TIbSgulhlJCTTD5AEyHaXAXjIZu0Lb+8/rT9e/Vv11/rv6D+uO8Zf3q+lX12+o3
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
KhaKGIgDqjNMCrn2QM9LDqTCw4PjrB6q/JRPm8b18eQoLRmhGgqtGx3qY9oHOgEKxfQadCIG2gzZ
wwOpaJRqb6PeA8UGw6A6yU2060HJzEmNodwaoyoYBWFHqXRS0UgGdKMfeD/TLir25ECUZWFqkSsH
4gSN3zSaAdTQzCT0wjyCatLZRoHy51iRK0w1VN8ajo+GN4FWhtOgVfmlG/V1Q0zPx7NUAE2mcKBL
hPX0cDQS649FTqVcBy4OMQ2lZcN9fTEqY9CcFDNcDTQ5xXjLLMI3GhWPJWKUIKiE5RtLprakDcVm
OswSk2OgM6Ob4rH0IK0HcBnsToByQ/tBVMPjuqHwJodOrojxY1X/DHHU4o2MRtOsGrCVkWhqyKQg
ZbabZU4PJkfjfaCrW2PRMcPEnUI+zQeSjILV6JsxizkaoVnMGEcyMzKmhIXNVvefHi1rcq6AaStM
RFBPONNGM6zrWqLP0WsXtbTO1lvnLZozt2XuXFletxoS586b19IC59bmVr114YLggqBNGcxkhtua
msbGxhoTWcFHkon8PhHVl6bCY5QX0AWhUYBpbXIT9NA1YLOSYOAbaCdNxSKxsN4VZn0jDSPWovl/
BnfTYCYRb0pkhsKJaFMifWmY2olGmvjfLDAWjUNq9K8XoXdNJh9ZbnCGkiwMpg7IEHN0IQTENhjM
N8P958wVyD7vYs4idYmo09LHfY/byz3LPQfHU9zT3I/ycIWZY5C9/5jhjp5UV/QkbAwfX8rP41fz
K/gz4RyE3GEWIvaZ7sgg3oPv4xBz8egkTIq5ZxQHQv8Xv1GQR2VuZHN0cmVhbQplbmRvYmoKNDkg
MCBvYmoKPDwgL0FzY2VudCA5MjMuODI4MSAvQ2FwSGVpZ2h0IDY2MC42NDQ1IC9EZXNjZW50IC04
MTIuNSAvRmxhZ3MgNCAvRm9udEJCb3ggWyAtMTQ2MS45MTQxIC04MTIuNSAxNzIyLjY1NjMgMTEz
NC43NjU2IF0gL0ZvbnRGaWxlMiA1MCAwIFIgL0ZvbnROYW1lIC9HYXV0YW1pIC9JdGFsaWNBbmds
ZSAwIC9TdGVtViA4NC40NzI3IC9UeXBlIC9Gb250RGVzY3JpcHRvciA+PgplbmRvYmoKNTAgMCBv
YmoKPDwgL0ZpbHRlciAvRmxhdGVEZWNvZGUgL0xlbmd0aDEgMTY3ODAgL0xlbmd0aCA2MjA3ID4+
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
CGpzrMnu6nE6sCPTo7bN+AdkJ71/9aqJlBRDxRVwfPRnzXBQxdepMtj9kXKWnswwnowsrb2OjYns
+5WvcTW3HWqa7Cg6nGqFnCg7szI4kiufytBIJj/Mx4pxHTTeIzMzhT24yh1EhzfBzITGVGwfx6Lc
W4LKz1hWx4zU0K7vSNeY6jnseBFTen2gdjr73If3ilAUXeHp6qTt6rDhVxWxTwZ93GlVnuHO3p1G
avDBmQuqncTMVNKOZERLSD1FMisyKjsPc3FGzVP9IjvpCtUXI2fryH454pvcXUJqzhOqRqZzMtkR
2zaz50ZWRvaVXTF7XiNOp6X7f2w3flDM6X5qVLkZX1lZAan9SnVuxDKxpPcKu4Oj6uzJrlKUxr4/
pHXH1J4qz3g/2W8Vcic24NFE83Hy/kjrs6fdcGrgHzWtaX3jK21na+SE9CmdH75DpCuoj8n9xNP9
QTuhzPrF6tlQnR505sa20J3VN1XgTJ956RM1ljnfpJ56x6uxlrN36vQpIHtKV/vb+JmJqCnXHeke
1TOms1cknJ3QQF8Jh25HFx/l4cc507thrzLDWTnG/4oMj4xxHdb61FqfeifxOxoT6mo4U2nHuEF1
fp+zFnN6JOB43Kkk/Y5Ms+o+od7mOh0dMWcvkxF/VkUcc84Z488Sa1Mm3xG1f8fUZM85SX+Mn0Xd
mZGgc7b41RmYPv+lpoSStveb7B3KGCV38qmPq56VUyM5go5EueoaAzTTofVlJGJq5uMOzc5a1JnO
P2dmdeV5+r0jPX9jZ0+eVn9QGdGdrPqUlN+Z8LDzfvJfit9Uvsay1kfOd1PJ7ciS8jvd5VM74YhU
Qu1T5aMmz1C5Slchqs6bWObsE04PG2r3+Kwzm8aYPeNPl0vD2XWMTJX9akrtbjHHdEtcdYuudIrM
m0L6nc1U62amP8fnQnfyYapo7YyPzkk4a4fSVQfOcWbdttCHb/hPnps//reObWmsfl29SW3/H5Ce
wWdlbmRzdHJlYW0KZW5kb2JqCjUxIDAgb2JqCjw8IC9Bc2NlbnQgODMyLjUxOTUgL0NhcEhlaWdo
dCAwIC9EZXNjZW50IC0zMDAuMjkzIC9GbGFncyA1IC9Gb250QkJveCBbIC0yMS40ODQ0IC02Nzku
Njg3NSA2MzcuNjk1MyAxMDIwLjk5NjEgXSAvRm9udEZpbGUyIDUyIDAgUiAvRm9udE5hbWUgL0Nv
dXJpZXJOZXdQU01UIC9JdGFsaWNBbmdsZSAwIC9TdGVtViAxMjAuNjA1NSAvVHlwZSAvRm9udERl
c2NyaXB0b3IgPj4KZW5kb2JqCjUyIDAgb2JqCjw8IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlIC9MZW5n
dGgxIDU0ODYwIC9MZW5ndGggMzAwNTMgPj4Kc3RyZWFtCnic7L13eFXF9j+8ZvY+/ZycXnN6Sznp
HUjZIaG30AkhEECkCAKCvYAFVEBBuSIKCioWQCSEYggIePXaUVQUFRRUQCxRVMRCcs5vzT4noXjv
93t/z/v+8T7Py96s6TN7Zs2atT4ze+cABAA0MB84qOnRvXrY+o39xwDsDwJwZ3p071/lirRj/H0b
gKRg4ozxs0a9+2kdgOp5AHP3idfN9T799PifAXJOAcjuuHLW5BktR/6YA+A9jeV7T55+45XrBz7+
DcAAOcDU26ZMGn/FqzPdOnziEaSiKZigupmWAhATxoNTZsy94UPYXIvxUQDKIdNnThxPZQ/1ByiZ
DmBaPWP8DbMUk9XXYn4JlvdePX7GJPWW/HcBdtwDYFk965pJs860HNIAhDFf+QKwsdH3f7j/hHD1
OG3pb3IFdgOvp0KDxzN/e9lWRezgX8skDnkEowosT8QC6ErXtz8CwO+PHYx9wJ9LpJ+/OJYiCRM/
9IFrQAIUdJANlZjxOD6XA8rvh8msIPqswe+JEnbBcaQo+ZLWk0z4CpaRCLSQ/XASTmDORngFPoZX
iQE+hG+IkezHMU6ASfAPYoRDoIeRMA8eh1GwBufqKqyxEWoxZIMsmAJbkUbBTlgKQ7EfIaiBifAR
LYOvSSm2DGQ3LINMrHEb1jgEt8JweAm2wV7sjRmmwwOYNx9z34MHoQ66QQk+9SFoJQ/RUvIPLKPH
ex62z540FFs6f2/EevG7JXGz1jruusTdRgZjL26BpWSm2GuRLWQXqcDnGLCvM7ClCfAPpNHQCBEo
gmfhS5JKwlCGo5kFJ8n3OM57YQv2ZSiObB7WY32agmSAB2I/4/gPk3YSwnZWYc8nIudlcBUdBklg
hHPIyQgcw7b0OAZGo5B78RuwDcA22d1CSvGZpaQrBbKFtJBu5CBybwQ+cydy5iNopaWxdrgdW38I
n5eJs5dEriPDycSERLB5uRXbZKXn4TgZ3RY7QV/FZy4T6XGMt+PT54s0H1vuoCzkG6MpyLVRWI8R
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
c5RUG0VQXW46JgS3oSJ00ZT0iwHmUQkSc9+Bt5J0qxYZtOf+NuUd+DDAHjQDLc9NZxy0DWaiK3Lz
YkgdfbwemfVnP59Sf+Yl+Z4p5x7NjyX5Ec9Vb+4z7D8BXOA0IqvxyzPovwAFu23yZW5kc3RyZWFt
CmVuZG9iagoxIDAgb2JqCjw8IC9Db250ZW50cyAzIDAgUiAvTWVkaWFCb3ggWyAwIDAgNjEyIDc5
MiBdIC9QYXJlbnQgMzEgMCBSIC9SZXNvdXJjZXMgPDwgL0V4dEdTdGF0ZSA8PCAvRzAgMzcgMCBS
ID4+IC9Gb250IDw8IC9GMCAzOCAwIFIgL0YxIDQwIDAgUiAvRjIgMzkgMCBSIC9GMyAyIDAgUiA+
PiAvUHJvY1NldHMgWyAvUERGIC9UZXh0IC9JbWFnZUIgL0ltYWdlQyAvSW1hZ2VJIF0gPj4gL1R5
cGUgL1BhZ2UgPj4KZW5kb2JqCjIgMCBvYmoKPDwgL0Jhc2VGb250IC9BcmlhbC1JdGFsaWNNVCAv
RGVzY2VuZGFudEZvbnRzIFsgNCAwIFIgXSAvRW5jb2RpbmcgL0lkZW50aXR5LUggL1N1YnR5cGUg
L1R5cGUwIC9Ub1VuaWNvZGUgNSAwIFIgL1R5cGUgL0ZvbnQgPj4KZW5kb2JqCjMgMCBvYmoKPDwg
L0ZpbHRlciAvRmxhdGVEZWNvZGUgL0xlbmd0aCAxMjMxMSA+PgpzdHJlYW0KeJyVfeuKLUtu5v/z
FPsFnI77BYYBt7vbv8c0+AGMbRjwgO33h5GUVZkpKfXV2hxoNtWxIhWhe+iWfyX67+8y/c/c5de/
/ucf//UH/2XkIn/473/7419+/T/+4zG7rP36x999Lc+/+L9//qdf5z/++z/++Pt/Sr/+439ol5z6
+LXyOP9BO/27bM1/Wa2t77+8Lsu5F/njHun+aeIPnf+gD/3pb3/8/V9paTvGGPPX3/79j/x9mk27
Zf7bf/7xv1JK9X//+tv//eMvf/vxJ+v7J7XIT67/N6d5tJTyc03bZk3OR5tFrfn69GNNP3prak2f
ds0+RlbgtD+ZJWUec0wNzjJraj92XgWCU/exd1Jrul3T1pFbrupbfzVrej7qJsJ4rml2zaajL32u
YdaMcSw6GDzX7Ecqc8H7WfXIc211LovSTTDjU+129DXU7TSDrJLKMeusCOKS07HWagqabtd0wuhG
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
lPo16icj+uFx3eTDF0Q/X6N+9NldLqOM+sFnP0f9aBqzrRe4X3IpA8LMLuNcE94PeXi5J6hvG9Fh
PZ884zvc5AnJ8IuYTWUc0PkaF56rSxnsVvB8FMcwdtdtzv0f+u//Ay6gVldlbmRzdHJlYW0KZW5k
b2JqCjQgMCBvYmoKPDwgL0Jhc2VGb250IC9BcmlhbC1JdGFsaWNNVCAvQ0lEU3lzdGVtSW5mbyA8
PCAvT3JkZXJpbmcgKElkZW50aXR5KSAvUmVnaXN0cnkgKEFkb2JlKSAvU3VwcGxlbWVudCAwID4+
IC9DSURUb0dJRE1hcCAvSWRlbnRpdHkgL0ZvbnREZXNjcmlwdG9yIDYgMCBSIC9TdWJ0eXBlIC9D
SURGb250VHlwZTIgL1R5cGUgL0ZvbnQgL1cgWyAwIFsgNzUwIDAgMCAyNzcuODMyIF0gMTYgWyAz
MzMuMDA3OCBdIDY4IDY5IDU1Ni4xNTIzIDcwIFsgNTAwIDU1Ni4xNTIzIDU1Ni4xNTIzIDI3Ny44
MzIgNTU2LjE1MjMgXSA3NSA3OSAyMjIuMTY4IDgwIFsgODMzLjAwNzggXSA4MSA4NCA1NTYuMTUy
MyA4NSBbIDMzMy4wMDc4IDUwMCAyNzcuODMyIDU1Ni4xNTIzIDAgMCA1MDAgXSBdID4+CmVuZG9i
ago1IDAgb2JqCjw8IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlIC9MZW5ndGggMjc5ID4+CnN0cmVhbQp4
nF2R3WqEMBCF7/MUc7m9WPxZ3W5BBOuy4EV/qN0H0GS0gRpDjBe+fePEWmgggS8z50w4CcrqWilp
IXg3I6/RQieVMDiNs+EILfZSsSgGIbndiE4+NJoFTlwvk8WhUt3Isgwg+HDVyZoFDoUYW3xgwZsR
aKTq4XAva8f1rPU3DqgshCzPQWDnnF4a/doMCAHJjpVwdWmXo9P8dXwuGiEmjvxr+Chw0g1H06ge
WRa6lUN2cytnqMS/euJVbce/GkPdJ9cdhkWYrxSFnq5ESUl0fiJKn4keL+S7OZx+/fbxSUJtSeG1
kXe6EaV+2Ln0hqm/vHjfePP1TuvT14j3XPhsjIuE/oGyWFOQCvev0qNeVev+AUD0jUtlbmRzdHJl
YW0KZW5kb2JqCjYgMCBvYmoKPDwgL0FzY2VudCA5MDUuMjczNCAvQ2FwSGVpZ2h0IDcxNS44MjAz
IC9EZXNjZW50IC0yMTEuOTE0MSAvRmxhZ3MgNjggL0ZvbnRCQm94IFsgLTUxNy4wODk4IC0zMjQu
NzA3IDEwODEuNTQzIDEwMjQuOTAyMyBdIC9Gb250RmlsZTIgNyAwIFIgL0ZvbnROYW1lIC9Bcmlh
bC1JdGFsaWNNVCAvSXRhbGljQW5nbGUgLTEyIC9TdGVtViAyMzcuNzkzIC9UeXBlIC9Gb250RGVz
Y3JpcHRvciA+PgplbmRvYmoKNyAwIG9iago8PCAvRmlsdGVyIC9GbGF0ZURlY29kZSAvTGVuZ3Ro
MSAzMDE4NCAvTGVuZ3RoIDE0ODk2ID4+CnN0cmVhbQp4nO29eXxURdYwfKrq9palu7N2FkLfpNMh
ZCcJCcFIGkgQDPsSEySSTtJJGrKR7gBBWRwXMKKijLsOKIjrQNgk4AI6Ku7bqKMDIo64jIowjsso
JP2dqnu7k6DOzPO+z+/74/3R7bl1qupU1alTZ6ubEIEAQDCsAQY5dS3O9k9iFt4NYE5F+FvdUq98
wbeJrwBkvAigmd7Q3tgS33tRG0BiCNbHNTZ3NRz+R0ExwHisW+qbXM765+pvkXHGJxEKmrAhxKQv
QPw7hOSmFu/ykBLtGACCYDzd3FbnhJkLDgDkxmD9uxbn8nbtKr0e+7EOcquzxfXwhBEpAJXtAAmd
7R2u9nvudN0BkDIVQHs5cN7pW1//7b5Njy80FX+vj8Wh+NnS8exBXu69cNfRMx/2Neof1OcBBQPS
E0GAT924/ukwUX8I+8v1D0Ii6GDQhz3JadiT+CiB+aDB0WbIhvG43EhclwHVqlPRogB46F9IsOSB
hQhuXQIc1lTAfWQtkegj8Ef6iG8jS4CvpcegF2lHYdtCLJfSIt8dSH+z5CHZWC5HaEeoRrgR4VGE
fyHcidCN9J18LJ8jAB4i6a3Qpqnw/QXXq9IchgMIlyK+QPoEqrVFyMdhqOBjJYBSbL8U55qtfQTm
Y3s99j+BbZVYPoX1GsQ34Dgf4i8g3q+7gQDOfRDxU9iei/OEImxHvtexZ5DW41tFHyFpOOd8hFJc
w4NlM8IipOP7GM3byWG4kBz26bF/EuIFuP5EQe+BepzjKy4zlAkfP53LEutrEL8f+dgkga8PcUBI
pY/BYhoJT9LHfHNx/1uVfSMchif5ngN7Qv5Vnn4JCo+LBgOuuXIwDPD2C1hzDhxgeSQMy7sQHAjj
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
ZrgAl3HldKEauPi5dbjqvKg1DXgqA3xxhWhrdAkSoTCBcXjQaAu1nV6cGtlsQ/sctKERHj9TaBYB
UQQGc92VlzqbO521qK9OD+rb4NFZ8rxWYQFd/l3gntTDQWNxyp52V527wV33y53LKMVWobt8rLO+
3s3PGNWkQ7i0DN7cIWQrfMU5TDW7W9x8Q7iIoFvW1rHYo6i80G7R2LYMdaazttntaeLr4FyKuFtQ
7ZF/PKr2LlkxBVVCQxcS8pjSMLA57guXdLo8Yhn0onWujlZ1Bx0q34LY09TW2VyPurrU7VqmOL9f
bJ/T4Um60J/UDzjMwB6RLeGm67wDZ8w35lS5bvj1aQXLgQGqF1EnwnWc3rGcYN6c8XKmnDomv3Ck
XDhqTGZOfk6OwTCvHBtzRo3Kz8dnYV6hXFgwumh0UWhQk9fbPjY7e9myZVkt/oOva2sZbBMuubTD
uYzLAk0QmcKZZrfVooVOR2/Whq4/gxtph7vO7ZTnOIVteDCWjcn9jbmzm7wtzdktXv7/yMxu8Sx0
cj+RxRv/ywHLXM3Y6vrPQ3gtW5WjoB7ycmSiSLM9IvF1DulZLHpWwMnf6FHGDG4vH9TeJtLnzsH9
bDN7gj3GdrP9bOdvvKBRrgeD+0rJLCy95/DcNmidX98Nv5T/Gm9dIn0/d/WP1XRnyGxSnDRRckjj
pTFS7q/M9SuSITmBnSweMmImtBGnuKS0nsNxq7jcuOFLgQ3uKcO5Voi03gkA/x8SnZI6ZW5kc3Ry
ZWFtCmVuZG9iago4IDAgb2JqCjw8IC9Db250ZW50cyA5IDAgUiAvTWVkaWFCb3ggWyAwIDAgNjEy
IDc5MiBdIC9QYXJlbnQgMzEgMCBSIC9SZXNvdXJjZXMgPDwgL0V4dEdTdGF0ZSA8PCAvRzAgMzcg
MCBSIC9HMSAyMCAwIFIgPj4gL0ZvbnQgPDwgL0YwIDM4IDAgUiAvRjEgNDAgMCBSIC9GMiAyMSAw
IFIgL0YzIDM5IDAgUiA+PiAvUHJvY1NldHMgWyAvUERGIC9UZXh0IC9JbWFnZUIgL0ltYWdlQyAv
SW1hZ2VJIF0gPj4gL1R5cGUgL1BhZ2UgPj4KZW5kb2JqCjkgMCBvYmoKPDwgL0ZpbHRlciAvRmxh
dGVEZWNvZGUgL0xlbmd0aCAxMTA5NSA+PgpzdHJlYW0KeJyVfduqpUmO3n09Rb7A/B3nAxiDa9zd
1x4K5gGGmQHDGNx+f7AUK1copFj6chVJFclO7fjjoJA+HSP+CPTnnyL9r8/049/+67f/+xv/pMW0
fvCPf//tX3/8H/7h0+ui/fmXf4p1FKaPP/jPv/z9x+sv//jP3/7y9/DjP/8fDZMijTJi+xFDbTzU
f6yx+SejlPH+yUeylMJYP5wtyK8G/tDrL/Sh3//47S9/I9L2tNb6jz/+47f4Xs5sNAL95h//9dt/
CyGN//7jj/8t/xpjfnqf9aSpvxua1J8YuhqnFENT4jNzUjQ1GJpWnph7UTTZ0PTxzJYUTfmboRnl
GaOoORe7rjmfHsy6mqZJtPaQ9bqCmQ9t/lNKVjQxWZr+jKK/dY2T65NqVTTpnw1NSXR8Ue9PNDS1
P2U0TdMNDe3zmCkrmmpoOp17m1HR2HWN8dSpj8J8Kof8lDimGsYcRY7jSSUrmmKOIuf41J7QqnIm
zuhDjWI2MJfyTDoftKhciTFSjR82+a9/oHuU+6cDlt+Jxbl7tIOvX8n/w/BomM/IOZ80Fx/H/kwS
ESeN5a2Y0kPMrWgsr8c0n/y6M/63cn9qrg3SlPq0QctE8ym0xXUomkteEB/PMAccp5FMGXHAdTVa
V5hTfeufrUxJT21qWfZaxUHCPPaohrHHRddhtJEUjRVNMz0x6eOyW5hCeFKv6ihisDT1ibVF9C1S
C3T3UkZLJ4VCXDkKWnuKxIZxQtZgETd7gMeeMrFhSQ3Oh8XgHAPOp5BMKfpILxFXiFVp4nDOlVi1
q+25pGALT61Zs4ZdVhukSYpa+iUpe3tGrQMeF7EYq3dwKVjgppYjXDlxWM41opVn4jBSEvpbl+Qe
T8t6e+yJ5phYiWZ0ATMpyPBS6u6ccyLFH2ZBR5ETiXd4jTPxVyp6VZZ3cglPnnpV9h7nQmqtDChS
cyVVnEJBB5qJv0ZvFc6ZtE3MqcPdaflJhsGuE+3xyYbBrh0kJkxZqwHLYaQCSA30Ctc1+tNKhnc9
z0jyUquKava5BDqvic+0kJyrRs7Z/SmkJlsamuMNRC2kJjujdDDnkiJd0ghvTsnEzUHLVAtjC8G0
ZIYxR1EqsWFL+FOV2JB4A13S0hiIGHViaTqhvVih+C4jEarWKvAah46U0AY8dgK5D6G9Do90kloq
daJv1dAIWUKOr4SnetGnbm97JeAzpj51yz2VsNzsRu6aKVc6ddJwepunpSnMzVDbVgZQFR9FJQDV
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
hux29pk2xGIrgaJXNZ9Ls2RObm4D7Q8nWUS2iQBrLE3HSWBAHixNlwwbXt244/ML1liKzkjCS89l
xr4RngTrua4l4f2wCmEpjlicNB/eK4u16lVdDj+67KNA2VMCR5hqQru8nIKcHnjQfPf+Vfx0wl8o
vw+xuP9Ff/4/jXPMjmVuZHN0cmVhbQplbmRvYmoKMTAgMCBvYmoKPDwgL0NvbnRlbnRzIDExIDAg
UiAvTWVkaWFCb3ggWyAwIDAgNjEyIDc5MiBdIC9QYXJlbnQgMzEgMCBSIC9SZXNvdXJjZXMgPDwg
L0V4dEdTdGF0ZSA8PCAvRzAgMzcgMCBSID4+IC9Gb250IDw8IC9GMCA0MCAwIFIgL0YxIDM4IDAg
UiAvRjIgMzkgMCBSIC9GMyAyMiAwIFIgPj4gL1Byb2NTZXRzIFsgL1BERiAvVGV4dCAvSW1hZ2VC
IC9JbWFnZUMgL0ltYWdlSSBdID4+IC9UeXBlIC9QYWdlID4+CmVuZG9iagoxMSAwIG9iago8PCAv
RmlsdGVyIC9GbGF0ZURlY29kZSAvTGVuZ3RoIDEzMTk2ID4+CnN0cmVhbQp4nJV966ptOY/d/3qK
eoGe7fsFQiCdvvxO+CAPENINgQ6k8/4QyWsvy5KXxl7FoYrDPtrTsizLQxfL8c9Af/4u0v/6TH/+
z3//4//+wT9pMa0f/Mf/+uN//Pl/+IdPr4v25y9/l3JvTB//5D///V/+fP3lP/7tj7//l/Dnv/0/
+kyObfw5Yvszhtr4U/+6vs0/GaWM908+kuXUyvrhbEF+NfBAr7/QQP/wtz/+/p/Dn7E8rbX+59/+
9Y/4ns5s9IU+//zbv//xn0II+T//+bf/Lf9KAz0hxApp6LMhpAlpUiaaUiBNTkRT1XdqMzQlEk3P
iqYbmhqIZoyTplw08wkxqO/EfzQ0bRBN7JCmd6LJSY1leR6NaIqSc02GZpKcY4uKZmiaFEjOsTc0
9xRJzhEuRUok5hTUkqZpaDKJOalZ/UMxJIWknLJeUctxISnT/yA7laTMKnzQZDurRlJOXa/oPxia
TlJOU61osfwMknIOA/IzScpZz93OKweScs5KM/I/GZpIYs5Va4aRYU4k5tz0ikZDk0nOeSjNKP/V
0pCcs97JNRiaQnIuEbJTScwlKc0o/2xoGom5ZLWkxQ7VScylws2eB4m5NLjZ8yQxl5ERzyWQmMsc
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
IDAgUiAvTWVkaWFCb3ggWyAwIDAgNjEyIDc5MiBdIC9QYXJlbnQgMzEgMCBSIC9SZXNvdXJjZXMg
PDwgL0V4dEdTdGF0ZSA8PCAvRzAgMzcgMCBSIC9HMSAyMCAwIFIgPj4gL0ZvbnQgPDwgL0YwIDQw
IDAgUiAvRjEgMzggMCBSIC9GMiAyMiAwIFIgL0YzIDM5IDAgUiAvRjQgMjEgMCBSID4+IC9Qcm9j
U2V0cyBbIC9QREYgL1RleHQgL0ltYWdlQiAvSW1hZ2VDIC9JbWFnZUkgXSA+PiAvVHlwZSAvUGFn
ZSA+PgplbmRvYmoKMTMgMCBvYmoKPDwgL0ZpbHRlciAvRmxhdGVEZWNvZGUgL0xlbmd0aCAxMDM1
MCA+PgpzdHJlYW0KeJyVXdvKpDtuvd9P0S8wNT4fIAQymcN1woY8QEgGAhPIzPtDJFeXJcu1VLVp
aJq/9fuTJVlLsmUr/gj053eR/uoz/fjPv/3yf7/wT1pM6wd//69f/uPH//IPH70u2p//+F2ObTB9
/MF//v0vP57/+Ptff/n9X8KPv/6DhikplR8jth8x1MZD/fcam38yShmvn7wlKzk9KWcL8quBP/T8
B33oD7/+8vs/hx+xPFpr/cev//1LfE1nNhoh1x+//u2Xfwoh5H/+8ev/yP/Shx4hxOrS0LAhpOnS
pEw0pbg0ORFN9ccpkWh6dmlqIJoxfJr5CDH447RBNLFrmjoNTe9Ek9NBkwzNaERTDjmXPxuaSXKO
LR7jjJMmBZJz7Mc41fCcIsk5HiKs3ZAkEnMKh0pLMTSZxJySO0whKad8aLRYjgtJmf46xgmGppKU
U3MtIzWScurDZbmTlNM8NFqaoRkk5RyGSzNJytnM3cwrB5JyzqdlmHFyJDHnmjyecyIx53ZqNBqa
THLOI3q6yJnknM+VXP7V0BSSc3ENLFcSc0nVUxdxSzTZXaS5k5hLPU3DsjxIzKVNb+HkSWIuI3sL
pwQSc5nDG6dEEnONxzi1GppEYq6pe+ZcEom5luTJp2QSc62naRi1l0Jyrt3VRakk5zqay08jObcQ
PV2UTnJuxoEbXZCIicYX8yQxt+I6jRpIzO3033ZaNZKYW3dNo0YScxvuaq+JxNxP/21XTs0k5h6H
t3JqITH303/blVMribmX7s6rkZh7c02jdhJzP/13eMr5T796EF1HeqNi/3eWM6hfwDqmEVjHNALr
mEZgHdMIrGMagXWHZsM6phFYr2hFKFivyHQUrFfkeRSsw3EUrFdk7gLrFVmXgnU4dYF1Gcb4QQXr
FfkdBeuYHYF1zI7AOp65wLp8y44jsI55FliHc1ewXpEzULAOeVawDuWjYL0aZ/AO1qEMBdbh1BWs
Y5YF1oVlSyOwLjT2WwLrmB+BdTgtBetQFQrWoWkoWBeaZmk2rEP5KFjHPAusQ8eiYF34+ROEdcyP
wLp8y46zYV2GsVGPwDocRsG6jGNEqGB90zQLfwLrUIQK1uHUFazDeSlYx98SWIcmpmBdaMwqVbCO
aQbJuc8TB9I30H/+zvfQ37+Afkwj0I9pBPoxjUA/phHoxzQC/Q7Nhn5MI9DfkcoV9G8aG1kq6Bca
uzMg0C/fwhk9/JZAv5DgjL4b63oD/UKCoR9zLNAPpaygH0pHQT/+lkA/5lmgH2pUQT8UoYL+jhyP
gn48jkA/5EdBv4xjdw8E+qGcBfqhCBX0Y5YF+vGnBPplHCsegX6hwdAPxaygH4pHQT8Us4J+OC8F
/ZgfgX5ohgr6ZRzLs0C/0PwBQj+el0A/1KlAPzQNBf2QZQX98FMK+qHzUdAPVaGgX/ixsC7QD+el
oB+qVEE/npdAPx5HoB/zI9CP5z5JziO4eNICyXkkzzJaIDGP7FpGiyTmUb1ZtURSHu0dDviBR8vv
/NUXwcr8IljBNBKsYBoJVjCNBCuYRoIVTCPBikOzgxVMI8HKprFbZSpYmcgqVLAy0UJXwcpElqOC
lYlMR4IVOC0VrMin7B78DlaE5ApEdrAiNDZ0kmAFz0qCFcyyBCsTLXMVrMi3jHdXwYrQ2G9JsCLf
svsCEqxAratgBWpdBStQoypYERq7byLBiszL7uXvYGWTRHvSIcHKpvkD3qeQcf70hZ9ht3Sr+PU7
EfqmEn/7r+yd2mSXIvvwnjTJlVqE8Uhk/5rm9njpkWY9aKzeIkU/pbTkjpPKo8ZxjGP3qWJuj544
qitw8zuW8hi8PAo8P4ik/pjLOXXrzCpNK7RzWlaChNw0q6xpomW5hQd9arr8tPyoc/rfIlsbtfrq
4sB4RVoFHtNECsZiZftzVDE6qX0Wl59JKh21ufzM8SAY7p6cEwXYPYzu8Zwoqht1Hjq9cq9YH72E
g+fLnRHwjhmPud+pKQf8qXn6SrmSyY/hmXwqmUx+TnfuFKjXFKc7d7Kx1k+V2mHIfEYq7ipl1Bjz
NOcL6Mh8UvKXReqTpm7GudLg8iBoHp75JDKxks9lcSEmxQF1nFb4Lzf49Fxdx5IDTT306Gk0cwrX
cvZYzuRiM8UmnngyBbR5xuJpNKf2qAtZsAgzxRwl5eRZGANd7SW78yrpMfK5Kq6NfcpRJkUmrgwp
jJy9FHfunMcU431M0JHJVOPsvnx6JI85mssPmWpZcZsaZ1qa+aC8sro6pXyol9P7XLogU20rmMJL
J1OgNGv35TM5AJyunAvZcwyn/VRj84XC2jZq9+RcKJga2V+CZIKPYKZlM/c0H7EV10FRjkXL4tCW
xcBCVhinwQG7IUHhcU3l9PFWOhSTtV6ntyp402KkUzj2U50h8HQa16wGGaGB0ktZFEHnPpL7rcnw
1oqnrBoY3k5IvssZJudxzTPUSoYxxqnRu1SB4e10CNdGC2mdbMd1dDUzvJkFeG1+RApros8zOZ/S
zxAqWPlU0kU1WGF5psypncFjuI5PKMpq0fUrlWCSYKC5IiTf00c5TWxamkkq9SOfSpHYTKdKLxHO
tV/jRj51kv9uwfUrjffOcnL9UwuVfE9xTbWRiVFE4qq9ke8poblybuR7SjdztxtIaRC2n3K2IQJF
l2Ty1Y2yGiXn5JtdGbZCXiMPNzJslfQ1zpzKhmKtkacr4eTZyqcHCqFM1NcsDWOOK2VyPr1HNxBr
FKO3GrurCUIuWn/d1cTshP7TXYCdrGftJuBPdfJh2Qzzc3H5eezaZL3G/SL3rchuyM4JApb0YGUA
J7Z5bfyocQwWR3KnY7Sqaa4MMPVHb/38ls0A1x7Tij/h8S9lrA8Kv4s7L0LakkN150WxXB3xkI/d
/YiVRFrzQXNvG9L6TNWnofXQZz9o8rVtGB+9hkPO1u9E8qczxOzOa/DRSCouP+RPYyqnDK/tR4ob
azplaLM7yilaOOVzFR1FwoB48nNld2Qbs+Xq8bwy0lxPft7UP8fRmvutQrlJ7v2gsSehlewnzO7Z
4cpIWx2eHa6UNK6NGjwOb2T2fKyLO92M5E+rO0wvxHI8l6lN6inMp4AvuyyTs+whH+qKdhx2lr2e
5mOzXzKfdq6Ku2J7Z6TQI6iMFNcukYWl6FuzyjZx2VYmnLBivrJNWu1mXtfWK2eSsXVPFStLbH26
8iHreW6LQMPIZDxpRndWnEe25A/DeWQu0+WY4rR1UqombqqSMtkOZf0unKz0r9Xk2SBFDjTxVjx7
LzFwxHwoq/7R0rCBBXcZc4pI1uIuY87/yNWdy9imo5z/VV8VhTKBYla6/RTnf+NE2yspo/yv53NN
XNlxIy8XT8S58lFOAOdI3vornRKTWlxELoRKPZ5oe81rkCpadD1zmXwoloa3jmvIj0yu2RNzJfMp
dpzrhJxUMcpBcyWk5FcIlKbnDypHNaO7n6KgZlSf41wf8zSM60Ol8FHzaTxXFjkIRs+JX6kUGU+M
2WenEdwYlu/i+vlYx12Orsh2CCFdd1BHYYQ8bdAKkKKV+dz8xSxTbB7yzJ4iOPuL8YyeruyGgvPU
/OiJs7+cT7y5MiDO/kZ1I1Byynwu0Lz11yjqGdOo1OYllP3FMk51mbXeOOqp3XWFpCrCv/xu3fhJ
Rnsb/X6RmEhFxFVjsBMTWN8TeS8or5wIFnpEQoA4Fvjhb1ESnlfAgz9FkUFax/UF1tOQ4Ahn134k
rN2h4OLRZvZZpvx6rCAEVlpFXp/PkNGhGY/6jAedskpOOfo59eswjVOOcfBjse+ZcpwafZty5HiO
cx2CkZifu5a4cJAAoOYxPHWlMAgAZvHETPHFo/bQPHU9D8rGwc9d58mbAsHnmRAgpXbybFMOMp9a
y3R5psDSsHwdXlUuVSjJUwWXV8TnmS6sN0qtPVJdPheLmbOS3H2W+aBsTJcdCizzyc1VWDLjo8bk
Gnyag9ZNSB43OVBkPmP2jJBslLxpqh7LKuOAZYOZDIP8QXX5Idyvz0wBSpminUeepyaucci7E/gf
/Pzcy/C9cK75zTy/8Ny/vWij7qKNa+cj8KlROmiunY/IJ0Icbyga6zkJc8n+h6a5yyvI2a+lKDSX
6yTMbWspOt8iraziQDWMrfbgaKxyZYmiuZw94VPg2lvnU63StNibqXEuL53J43EIrsax0xqU2efR
3G+RJx9jdleEKxyLB82107BCrXSI+dpk4Y324asrcTi2DhDUtwz6rA0mTjqx9SwnPdNJ885Jl1MV
l7PPbD3BVdeqeOjxUJfNvNYeVE2eEa7tpREOlq9CDt5eyvEY576rFx+U4xXPMthJZ2s9dlpcqbAS
OEdb7KbXsZHzLXbTxnou1xn6z0QQz2u56ZaPRXq5Tq42L6W54yQCw1m7x/Ny0ykPzzRWGcKsw5Nh
LpQsrmp8h+dKzif16tkG5aTkWaq7SjOXSqfuz71TTNaHu0pz50AgdHfu5FlySq5zppCNloWRoZ37
pEiglurOixK9klr1+CnkfcocxbOxQp6lMYw5PMv+EeZnlRh0A15vSgzInM+52w2SnPlYY7rzWntM
0bUfLjJIOZ3ysW8vVNLXMOv0uhRJIcU6dsToVShIbGufAK+ddTPi9IZ3kQGZ4doncKY1uA7VmPz1
HgKDTvfVNRl0pjutn3tMp7rsfgPvH81TFdeeBLmoal2U/RalGD1WzzLW/lFr0bOM5wbScAGukoei
pOgEL3snkg/OaijutCgLqelElIsfPlybxV2BXKvQedfAMY3K5Z6zuahDWRzFIyauuQoRuCjLIJyV
Tx9c09c9M+RiBbKwc+5222vS3EN1PRTJhrLP7nq6ymWjxY/7GiU05KHc1d4ih9cmXrPjJA6vT8S1
QQtfQZkjn/yYWKxxFtu6i+6Ns9hoUMduRRVCuO6KsNXX1TZsPqsOYZ7LwqqrNa64aslb7asOofdz
6dgbOoMrroYbaLXJJVftXQj+4ej/DAS/T7pgaUVkJ5eWaGCZS2Qnx++oaRqb5axN8hUSwwKMZ017
dIfhnKul6LJMDmzOcLBz1avzNnlLJ8tX0kUQGbPPMt97mMt34/pw3oZbN/HUt+yNY07e1h5JhRU1
nLzlMV122De1BVv4VgCXovdlgJhl9jtP/w4LK1de9kR+aBl8pyiNFe3i0m/eAs9teupKFBnVMFwx
p8RHYuH81pW8cYHvKR6beHBtwDPKwJ8i6yFtuVaYKiU56wDTmXrlE7F2WNhVPU++aa4DTI+Ggu9V
G4etmQ/+86qNUzRWzHzwn4Mv5kHB3BMCsLq4kqqX4ZoGJ3jJrIp3+3C9u7pYJ/9leuJZpejBqOIq
V+9c7ngudnvJiaywR6OKa6uOcu11mVJoLEKu4oBSkqcKLg4Ys2b3W88S8uLOnaKnHFJz504OiqKs
4XmNTM6nt17dcfhGYzLL68oBSV2zuqZKTu6RSjv5uXLAQrlSP+Z+XUqbnLNP19PxjfX03IZxaBoF
+icQpCsHbJRUnB7qKrZOXJLmOY2SuQbYR9tC8NbLzC7Hhe+4xBMCr+wusmMpLj/koPIzbsQ0nN0Z
53NlgJ0rgQwu2dStU4TQDOZc6R3hUome8XAJeZtnhHClSlxCbhR6358n4zGGcaUdpPScTodw343n
fflSPVXw/flazKKwqQlHPqtSw/lW5kR7Vm8BVsK3vp4gwCa2CgRichcpFwiEdi72twUCuZ4mb1PJ
VvgOkAvbq878hJNLpVxmvi4FOixzCXk9Y1DrmyvvbBsIvAsNGu+Vut9a5eE5J2/qjUwsj3MlXxkO
wVt7Zr/QN3NWNmpx8Y2zshjN6rKpUuZ6juSafMtcz5Grt0obh0exuLDNhQbkNKLLM4dQ5QzSr4yU
PBSlS67/bo2x68TSa+584y/37C0Lgj/S+3gnnw+FD2+j7S/SMlx1K2kZrGOJXN8UwkljEwa+jjzW
1iWupOb9qWeAjiupE9+yGscw9vSf96fyPNi533EgCcd40thskx3YjCfLdlrswEo6+XlzpvYzdYMF
vip1g6VAkSucTnbutKzwPb7uskOxdy6nCO+bxo3v8fnTWltG8WTZxt6BoP8guJ6i5vd3oms6ifeL
zMTvgu3M1WjTM+WUKR81n7pIuJLxNJ0rteN7K8+AGRc2l/mIz4AZFzZXLpVdgS6uMW9cKzuLy3Mb
5Jj6uYrfPDwx1n1KbMp8PXjOOdxvUcyTU5+eN0gEWnnO6crwWYztepV1h/hcWVdBcuSzjrUfhIch
pzKNhd052aqndVW6yifWtWes0nUuF+ap0uuJbQ7TQvLUngnXynPTCPPMZ3dxZE9dKm/D3yJco3yi
eCuQC7/nNMviuh6cHrEaELDf4nO5dV1EjWPzSC7rXjVgisaeE87IjxMcJn+dkXJd93rkAPPMdd1x
PUqhaOy5U+RqvDE9GRaynxLDuSxsAXTizcLq6nSdudVTPm/P3NaVJDWOzdwKX+Mrrt5XYbexjSuP
5Iu9H1xUIRfV22nz1yViQq5gXNRdtE2upebhra8y+CSjnK7Fypni6lX/iU2Mz+Uo60ieaXDm9rzn
gadeuSg0GySw6cKKe4yYrzM3AqZ8itmaT1030eIhniul4KAmpOrNfR261eGqYh26xeKqYh2omYDl
ztwGuajuipAvopnFZXNEzsmeW824GL3zWUdww8KVlJl45Rpn3UPLrnAm3y43mHOdgnFNaHCNp62r
auZb9giHH0+p2YX/tiKf6K7RlZPVfBqYpeFSolCap9DGpUTPOg+IFauwO/uY09Z1NoM5Vy5FBlaN
X7HfapVvu7sLuXV+xMf4VPts3uB7QmeYdeWI6/WU07FcJ5srPDoxx8YsPfCpSH8XZn06cnsXsn+R
28HKUilqr7CSU27bKhqbvPDuVC8nzZXb7WM5XNq97q6snTA8DvvB3I95Xflo5hvzZu7XOK/qeDWO
Tbi4sCCu7WHMM9/IXffmhMaGfPyQX10vp1RbDauSO8prUzho7vM9huPl3zENl9CvFzuF5qpv5cLL
2E+92+SXt6fa8HW6b+0q+cBbu5jnVUKfTp7vW7v15x0zbKurPH6c/NxNi163drFO5dYuntd6IyqW
7s6Lt5VG656trrLKOrqni1VWGeZw58VllS1M91v8/GBOxzjxj1+4kTTCm3l+4XpQVTZ+5rPhMt/9
zKdDs5/5dGj2M58OzX7ms8E6DXnms8GaEHnmU2guL7yf+RSa+Ee78l/PfDo0+5nPBus95JnPBstz
5JlPRQPfJMdz3898YjHLM59Ck657KD+f+RQS+96jPPOpPtW/MLj17OfF3hdGiusZxEgxjRgpphEj
xTRipJhGjBTTiJE6NNtInfKTbaSbJlsDFCPF5TBipPBkRBkpLiAQI4XnhWKkTknINlL8qW2kMsxV
yrGNFJdO7LdoGzzzkLdoFc21Jfh6i9bhZ79F2+C5iLxFq2hgKzw8jrxFq2jgw/lYFfIWrfOt/RYt
lo+8RYtVut+ixcYjb9EqGrsluN+ixcYsD+dj05CH8x2W98P5iuYqRX89nK94hq3wFI29q78fzsdz
l4fzsbrk4XysLnk4H89dHs53vrUfzne+tR/Ox2a4H87H6pKH8zHL8nA+FqE8nI9Xjjycj1mWh/Ox
OcvD+Vg88nC+M6/9cD6Wjzycjz2dPJzv0OyH87E5y8P5eJz9cD6eljycj8WzH87HRigP51/a+uLh
/Iu9L4IVfMonwQqmkWAF00iw4hy47mAF00iwgmkkWHFodrCCaSRYgdtCKljBh7ISrMA9VxWs4BM6
CVacw9JXsIIP3yRYgbuKEqzgYSRYwUeuEqzAVx5UsOKcce5gBbMswQo88FHBCqaRYAUfKkqwgg/W
JFjBh1QSrDgHhjtYwQeYEqw4h4GvYAVPS4IVqC4VrODzQglW4JmZClbweaoEK/igRoIVOI4KVuA+
sQpW8FmgBCtQPipYERrYtxfrQgUrmB8JVvDZmwQrQgODFec8bAcr+GREghU4LRWsQNNQwQr+lgQr
+PxJghW4clSwgo9zJFjB85JgBZqGClZEFV/37b1U/AWs4y1ggXVMI7COaQTWMY3AOqYRWMc0AusO
zYZ1Z4t8w3pHK0LBOj5CEFjHxwMC63jLVWAdb91uWMe73wLreLd5wzp+IEVg3XnTZcM6ZkdgHbMj
sO5sWm9Yh68hKVjHPAus42dLBNbhgYaCdcizgnUoHwXr3TiDd7COn3XZsI5fWhFYxywLrAvLsG+v
osF7EJgfgXU4LQXrUBUK1qFpKFiH5zQK1qF8FKxjngXWoWNRsC78wL69Dj8C6/It1LdXDQP79uJh
FKzDV6cUrG8a3LcXi1DBOpy6gnU4LwXr+FsC69DEFKwLDezb69DIHoTFii/69l5z+AL6v2iF59AI
9H/RCs+hEej/ohWeQyPQ/0UrPIdGoB+3uRPohw3hFPQLDezb23CzN4F+3HxuQz/uPSfQD/umCfQL
CYZ+zLFAP25zJ9APpaOg/4tWeA7PAv1Qowr6oQgV9OMWdgL9eByBftxST6Afdi5U0A/lLNAPRaig
H7Ms0I8/JdAv48C+vYoGQz8Us4J+KB4F/VDMCvrhvBT0Y34E+qEZKuiHXRIV9AsN7NvrzEugH+pU
oB+ahoJ+yLKCfvgpBf3Q+Sjoh6pQ0A8bRCroh/NS0A9VqqAfz0ugH48j0I/5EejHc5fjB+gx5fgB
WoY6foDTkuMHOCt1/GBn9c3xw28v6OlfFPQ4NDtYcWh2sOLQ7GDFodnBikOzgxWP5hWsODQ7WOm4
MGgHK4oG9u3tuOhnBysdF+vsYEWNg/Yp8LQkWFGfQn17Oy4v2sGKooF9e51Z7WDFYXkHK2rmMFhR
34J9exWN/dYOVtS3YN9erHUJVrDWJVjBGpVgRdHAvr1qXqhvr5Dgvr1Cg/v2qnG+7tt7qfhzfWL/
7Tdl+96pzfbaKTnosSpUO9xt5ldjw+BC8w5341c19bqj79HMB0USXdO8c4ut54PmfiM8covScdDY
cqy8nr6aB827V45KP2kut8hvX033U9yUd90hcz5F0F1SOmi+KmJdhdyXuL7Q+G9P0PuGyav+TTAP
BhUK83BPd8G8LxJ0obm7Mm/Mg1GFwrwvEnQ1DsY8PHfBPBiPK8yDOYTCPNxFXTAPp5cb82AcrTAP
D7MxDwZmCvPwXoBgHv6UYB6UjsI8nOgL5kHrUZiHtzgE86A1K8zD2a5gHs5kBfNgqK0wz+lnvzFP
aK72vC/MwwmxYB6elmCe9KqHe/PO1HeCjk1DEnRsGpKgYzOUBB3PSxJ0zLMk6Nh8JEHH6pIE3eF5
J+hYX5KgO/LZCbozr1eC7ohnJ+jYz0mC7tDsBF3RwATdGWcn6HhakqBj8UiCjs1QEvRLXR/2y9u7
JfAZjkdEzkDgeMDgVuB4wKBd4HjApEbgeMAEQeB4wKRG4HjAwF7g2Blnw/GAiY/AsRrHPvO44XjA
JEvgGPMscDxgUrPh2CHZcIxVseFYkbx5nfEJxw7HG47VONcrHy84xpoQOB4w5RM4dqa14RhrS+AY
a0vgWPFzPavxgmO8cgSO8coROHbG2XCsaK6uJD/hGBuzwDEWj8CxooFwjFUhcOzws+EYq0LgGDsx
gWNsqgLHWBUCx3heAsd4XgLHQhPtnvqGYzX3b8qlSqtv5PUFBmQkPoUBsMReYQB8ZE1hACyxVxiA
rz8JBsjjcRgDvriyNWDZu8IAzI9gALwNojAA8yMYAOWsMABfXNoYgO9RCQbge1QbA/D1J8EAzLFg
AJSOwoBsjP0dBuBbZoIBeOqCAZhnwQDh2To5wQB8/0kwAN9bEgzA95YEA5xrXRsDoGUIBuCbX4IB
+CaaYABmWTAAOhaFAfhbggHQsSgMgKpQGIDvJAkGiGOB5VJ47goD4LwUBggNxgD8rZ2SYdOQlMyR
4Sslc0h2SqbE/FUZz8ne95CEt4kFkmABtIIkfIFFIAnWmStIwt8SSML7sgJJeLtZIAnW6itIwjwL
JOHtb4EkLB+BJHzNRSAJ8iyQBFWqIAnfutmQhC/CCCQ5l3c2JGF2BJLgJRcFSfjyjkASlqBAEuZZ
IAnfPBFIgrcvFCThmzACSfjyjkASvgQkkPT5Yo4zLYEkzI5AEjRCBUnw/pOCJKGxzc4EkuC0FCRB
lSpIci7dbEiCPCtIwt8SSMIXhQSS8IUagSThx8KWQBKel0AS1KlAEp6WQNIXF3MwO7JLiKcuu4TY
X8ouITYN2SXE85JdQmdee5fwmtcXu4TXPL+AY+edrA3HzvtWG45hIbWCY+ftqg3HsEhawfEXF2oG
rI1XcAxr/hUc4zewBI6/uFDj8CxwjK96CBzLt940g3nCMb5VInAM67oFjqHWFRxDrSs4xhdhBI5h
2buCY3glScEx6rsLXsIZ9Y1mPh+OD7Qbn+CvTFgjErkKjvvTeiTlsfoceyTjkSKvIKGxr2mu+ol4
MHMt6NdD42qU6xCem4uNcxj7jhq5w5oYBSfc3+R35krPJ8fXI+L1Z5tJhx8unzACvAvPVnee6E6d
1nxZ7wKqb71Z82X1P1bjvFnzebnjCTcL1yvioVfvW/w+XFmIi+fOLdZzCSc/VwFb4x6Jrk65SVRe
XZCwfLhJVCmlejolp8Bdst/JkJbI7/8Sf/z1H7+kH7/+/blcMnifihs/zmNSQQ0SeJCwB3m/TN8O
cj1OxE1Moy89ssC6HuR2NMUNENJpyVfvp86PdleXHe5/ULq3grk7VM3nurqfL5qPPnpx9T25pcUs
3hrOHO2udsRY3zlyN6/Tpdz7ZWSjMXWPH8qBHhSlu9rKiex4NaHG2spkfy304Y5DUXPr0+enpEev
p2XcZy/90XIqLj9kPX01a8T64qfInwmVorHnRS090mpr7IxDEXpdbWmxpa42UyGfftDYGLeQerY7
cWRIye1MzfWV3EIqrG6N2A+u9lCrWyO2+ULJ7TD2c2Uw5OPGKK4MOeuKq58slmEh+MvGNK7SDO6a
MqI7rcxdU6aL6dxDqvfoipmTt1FOdd3JGz/rXQ+aZKdVubPK6Zbtc7YENY9wxg/3tiS//B09g+f3
zNPq3eMM0xkgiwts/OZ5Sc1bf5TtEO77/qBMfrq5+zqf3AjVeO9rl5SrQU8svlJAwuuUWvaMh/sV
53765uvF7sidUIcLFdyvuIXgxg/8djr5sOYZKr+LPkNyMYffPF9NNBx2KvezdCXI/ayGMdP7amrk
JNqXYJsk5eRGV5WitMxVzh7L5OXKavzk8DMKeUuDAlebYU6ppos43NAqmnFsfNAoxE81TW9eLfID
4sVjp5Hx9JxcMTcC2zlG9hYXX5gZbfjsZE673EkVfj08ut5gdaoyPu5dpypagifHVyNiDtR8f7q6
WZV88nw1IuammCbEsteJOneSP43weg1/cCf53Fx+Ruei99MIrSYmhd2r9/aliU8vp5c33/6c3E5c
D7BfTlc0NvvZL6c7NNz5ofKdgQmP7TjLbGvXyBmHDLDXJT7nKdjwGKkfNG/bWfVxzL1er5m3F9o4
T8FSJtrHQfOuHLw+/QWuqeDXzIevik6Oe7XIVTTXs8f9kVaL3AlPEblbMSXqh5ivpJc7oD+TQxnn
6lZMAVjKzRMPd70aqzep+tb1fHJ5zGbUZTe6uEt6NPJ5U+v27NTs8MO9H0rsngxT4YbYvrpSWcHw
MS2bF9cVCx/qug+eyMkFX12p8aL11ZX6ipd9dXHrh/ZBXesAy6jrqqnI/Gb8afHXy3IU8+Q+PPnk
MCnGmJ5lUNb7qOupd6x1PuN6QgAuYeAmw6O4zORMa6tGT8icIIbR/E+Vxk1nkjsrCq5SDsmz99Vj
eETXXfJRWX0mo071Rrhdqq3e6GRgvWVXPiPdLvXqZ9X43m7zabjX5fQNY3ZCv1PrV4IY+HzGXzh8
LJezv3BWP6vhL5ySOOn3Fw5niD1Ud+4ls58zvufNI8Ep9unyTDa2ekdi0ygcnKcQXZbJxOrq6uuw
TP5prBNSh+XGPUiMidk3fMg/UQzmuu/V8mp1knd4puicgj4XTrgtVk+9ecuL879hUPvO7QJlvuVU
xfWyAJnquXK+uqFX3zqsL+K0337YN794Pc+h2Yd9Ds0+7HNo9mHfxId0+7Bv4sO1fdgnNLjNhNDg
NhMOzT7sm/DISw77JjyqksO+CQ8f5bAPz30f9mExy2Gf0MA2E0KC20yoT33dZuJi7wsj/eKdJ4dG
jPSLd54cGjHSL955cmjESL+4RurQiJHia7ZipPiqqRgpvmYrRoovSoqR4ouS20i/eOfJ+dQ2Unyp
VYz0i3eeJrwQJifSE172khNph599Ij3hhTApEFM08OVmPI4UiCkaWCCGVSEFYs63doEYlo8UiGGV
7gIxbDxSIKZoYJsJbMxSIIZNQwrEHJZ3gZiigW0mFM/w5WZFA9tM4LlLgRhWlxSIYXVJgRieuxSI
Od/aBWLOt3aBGDbDXSCG1SUFYphlKRDDIpQCMbxypEAMsywFYticpUAMi0cKxJx57QIxLB955wl7
OnnnyaHZ7zxhc5Z3nvA4+50nPC155wmLZ7/zhI1Q3nm6tPXFO08Xex+DlRpwyckrWPFoXsGKR/MK
VjyaV7Di0byCFY/mFay4ND+DFY/mFawoGthmQtOgNhOKBraZ0OOgiFrTgAtWmgQFK5od0GbCG+YV
rOhhULCix0EXrBxN7GDFY/kVrGga1GbCo3kFK44mdrCiaVCbCYfnHazocVCbCUcXO1jR3wLV7N60
XsGKo64drDjq2sGKZge1mXAWzg5WnIWzgxVnnB2saBrUZsIx5x2sOPLZwYqmQResHF3sYMXj5xWs
OLrYwYqmAcGKJ+ZXsOJY8w5WnGntYMUxjR2seN96BSvOytnBirNydrDirJwdrHjzegUrjmnsYEWr
4ts2E7eKv4B1fMYnsI5pBNYxjcA6phFYd843N6w7d6I3rH++N+3RCKxntCIUrMNdWQXrcONfwTo+
LBRYx7d+N6zji8oC685Z4QvW8dVqgXV8LCmw/vnetMeOwDqeucA6vlUusI55FliHc1ewju8yC6zj
i8EC61A+CtbhvXIF687x3AvW8amawPrne9OaZfR2hqZBexAePwLr+FhEYN09DfsJ69A0FKzDIw8F
6/hOtMA65llgHToWBevCD2oz4fEjsC7fAm0m9DCozYQzjIJ1WGCgYH3TwDYTjggVrMOpK1iH81Kw
jr8lsI5PzATW4YmignVM89qDuLHic5uJew5fQP/nxpEejUD/58aRHo1A/+fGkR6NQP/nxpEejUA/
vr8v0I/v1Av0f76frr+FM3r4LYH+z40jNQ1oM6FJMPR/bhzpSFlBP5SOgn78LYF+zLNAP74vL9CP
GzUK9OOL3AL9eByBfnyvXKD/8/10R84C/VCECvoxywL9nxtH6nFQmwlNg6Ef360W6IfiUdCP77kL
9OM74wL9mB+BftykUqAf34UX6If39xX043kJ9OPL5xv68TV3gX7IsoJ+fB9coB86HwX9+A67QD+8
vq+gH9+XF+j/fD/dm5dAPx5HoB/zI9CP5/46fnA85uv4wbGMffzgTOt1/ODMah8/3LP6fPxwz/KL
YOVzQY9HI8HK54Iej0aClc/tMD0aCVY+t8P0aCRYwYVBEqzg1w0kWMFFPxKsfG6HqceB+xSfC3r0
p0CbCU2C2kxoGtRmwpuVBCuf22HqmeNgBb9tIMEKftxAghX4uIEKVj63w3S0roIV3H9SghX4uoEK
VmDJmAQrv+1xg1z7G9W8fqdgn+LUX5VHn0syTv1VftQZikuzbvvW6tKQIccRuk/zs0eDR0PS63wF
yaOhWK+2BfpO/RUX2saDZ1sqF/laUG2HDE0nj/dij+OdvOh3/o3+/D/tsQ7QZW5kc3RyZWFtCmVu
ZG9iagoxNCAwIG9iago8PCAvQ29udGVudHMgMTUgMCBSIC9NZWRpYUJveCBbIDAgMCA2MTIgNzky
IF0gL1BhcmVudCAzMSAwIFIgL1Jlc291cmNlcyA8PCAvRXh0R1N0YXRlIDw8IC9HMCAzNyAwIFIg
Pj4gL0ZvbnQgPDwgL0YwIDM4IDAgUiAvRjEgNDAgMCBSID4+IC9Qcm9jU2V0cyBbIC9QREYgL1Rl
eHQgL0ltYWdlQiAvSW1hZ2VDIC9JbWFnZUkgXSA+PiAvVHlwZSAvUGFnZSA+PgplbmRvYmoKMTUg
MCBvYmoKPDwgL0ZpbHRlciAvRmxhdGVEZWNvZGUgL0xlbmd0aCAxMzc0OCA+PgpzdHJlYW0KeJyd
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
if25t/qJSfFWP+Qzb/VDVvNWP/EJ3uqHfOetfuITvNUPOcG3+iFzvdVPvPdb/ZQ/6fPl8uHY5Tf/
Rf77fxjb2HJlbmRzdHJlYW0KZW5kb2JqCjE2IDAgb2JqCjw8IC9Db250ZW50cyAxNyAwIFIgL01l
ZGlhQm94IFsgMCAwIDYxMiA3OTIgXSAvUGFyZW50IDMxIDAgUiAvUmVzb3VyY2VzIDw8IC9FeHRH
U3RhdGUgPDwgL0cwIDM3IDAgUiA+PiAvRm9udCA8PCAvRjAgNDAgMCBSIC9GMSAzOCAwIFIgPj4g
L1Byb2NTZXRzIFsgL1BERiAvVGV4dCAvSW1hZ2VCIC9JbWFnZUMgL0ltYWdlSSBdID4+IC9UeXBl
IC9QYWdlID4+CmVuZG9iagoxNyAwIG9iago8PCAvRmlsdGVyIC9GbGF0ZURlY29kZSAvTGVuZ3Ro
IDc4MzkgPj4Kc3RyZWFtCnicnV3rqi45bv1/nmK/wNT4foEQmM50z++EhjxAyAwEJpDJ+0Mk71OW
LZfWrh2abpqNPl9kaXlJll3+w9E/f/D0n9rDx3/8/cf//OC/FB/GH/7xnz/+/eO/+Y9XzUP25//8
IdU85P0H//Nvf/n4/J9//O3HH//iPv72v9RMibF8NF8+vMuFm/rraJv/0lJq918exUqKYfyxFyc/
ddzR5/9QR7/8/uOPv7kPn65SSv34/a8//D2dXqiFRH/7+49/cs7Ff/74/b9+/Po7+omnDr/7m9FN
UT+RFl2+nPMZylCzzoUOZUIkmZSgTAwkk7d2clYyyZNMjatMakomO5JpbZMpWqZfzjvcTmkk4+sm
8y9KplaSGWqXMXcl0wrJpAL76qRnXzyae3CkZ1/hegVPevabCoMaTgik5uC2Jf0lKZlIag7brFxV
Iom0HCJc0ZBIy/SfVSbqdjJpOZStnfSLkimk5VAb0mCopOXQIxxPIy1H16CWO2k57nPXfUVHWo6x
IguLntQc824Zau4xkJpjgSsaI+k5No+sMEbSc9w9OevxJNJz8rCrTGpOIaNlp9GSTNyd9E9KppKa
U4amERupOZW9HbXssZOaU4NLmhypOfWGxpw8qTn7iEwsBVJzDhX2FUjNOQU09xRJzTlD0CCEJpnq
kWmkTHrOrcAxF9JzcXBNUyU9lx3Ak/J2UjHJROQVqZOaS8rIK7IjNZcdv3VX2ZOaS4WmkT2puTS4
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
bmRvYmoKMTggMCBvYmoKPDwgL0NvbnRlbnRzIDE5IDAgUiAvTWVkaWFCb3ggWyAwIDAgNjEyIDc5
MiBdIC9QYXJlbnQgMzEgMCBSIC9SZXNvdXJjZXMgPDwgL0V4dEdTdGF0ZSA8PCAvRzAgMzcgMCBS
ID4+IC9Gb250IDw8IC9GMCAzOCAwIFIgL0YxIDQwIDAgUiA+PiAvUHJvY1NldHMgWyAvUERGIC9U
ZXh0IC9JbWFnZUIgL0ltYWdlQyAvSW1hZ2VJIF0gPj4gL1R5cGUgL1BhZ2UgPj4KZW5kb2JqCjE5
IDAgb2JqCjw8IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlIC9MZW5ndGggMTMyNSA+PgpzdHJlYW0KeJyV
md2KHDcQhe/nKfoF3JbqR1JDCGSTta8TFvIAITYEHIjz/pCa3YyqVDNVbjOwDL1nStLRUX3dM3Ur
8npX5U8/YPvjy+Wfy/VKq/B64eufl9+3v68X986v2v/fvGMmuurrdn399nF7e/P18+X9x7J9/lfK
dJQKo7atFm7XUp9ea1+vDKJxu/JQ1mmM14tHK/rRch3o7Y0M9PRyef+hbJX21lrfXj5d6m05R9s6
F9xevlx+KAXaj9vLX/rfWtrOg9BqGJxGynZkWjTFaaDtBxEsGnQa5L0cvIxF5DSEO1Bbx2KvGXuF
vpQZTsJthz6q1RQ/nVZ25LJo+Cen6WU/kJbp0M9eQ3s9Ci91uteMHRosGnpymtF2qrhsV/3lVfP8
ku2wDP5gnbfP1DgV8P0fodDNIptbKqcaKSsRPFIN4H6NhdXcOY4gGl7q0OFDUkXTMR2Li2jkdFmN
3xU+9lLLUof8IWpDNLVbzd0h6l00CIum3iegVFp8Jp+kQ3yurWb+QBGfa1/q+ERCFZ/rkZYBsRkK
Z8sCFJshXRWQuAy47GjxQ5G4LH+y3QIWl6Etdfj5RHCh9Qd1T4S9nQh7rNGwxxoNe6zRsMcaDfvU
oO/QGvapYX+wNOxTAx/CsLcTYZ8a8q1Vwx6vS8Ou8znCsE/NE0Vh16H6meQAPJjeieSME8mJNZqc
WKPJiTWanFijyYk1mpxEM5MzNehblyZnau4gqMlRjYe7JieejyYnrGOSMzX+XkOTE0u0TY7oQGib
jMtomwxXZdqk1nHn3LTJeOVNXJb7o6WOgxp0cRkOTDVDXMay1PF3dHCIy7iu3fcCLOIyYs/mjFVs
RobMHwSxGdu6ow5HiOIzjjQZiOIzrifZrx3lLrTQUsYzFllsJuC0TBObCdNDil1sJl621N+p4hCb
qR3psg6xmcaypeTaOxWxmY6RaqrYzDVtGgRiM0PPokEgNjNBtl2EYjPzWsf5TCQ+c6/pfOSJoPBY
thQc/qiJz63kdeRuv7S1gd/NZ4jPDbOGQIfY3IizpcuziWjW/v3k4sNVbG6dshhyFZtb3r8ZxOa+
9m/fmxnF5l7T084kNve1f7MjNrPY3OnRac/Ryu1Rd/w2jlv8DDhxnGgmjhPNxHGimThONBPHiWbi
ONPccNziZ9KJ4xY/+k8cJ2NNHBtN+NRixvIwmTg2Gg+uG45VQiGOk6FuOI7dURy38MlfcZzUmThO
VjVxnNSZODbz8XUmjuPdUhybsUIcx2tXHMdzVhybOq6pKI7jOSuO4y2dOI7tURybMn6oiWNTx/U4
xbGp41KoOE7qTBzHFiqO43UpjmMLFcdJnYljMx+3XYrj2EPFceyP4jiZz8RxvO2K40Rzw3GcZsVx
3AsVx0bjkT1xHG+F4tjMx91hKY7jOSuO46Urju8i9g3U8iMmnkCt/07xEWpjjaI21ihqY42iNtYo
amONojbRTNRCdNINalXjv7BU1ELUDQxqITo1BrUQnT6D2nBditpwOga1Oh3XMBS1EAXZoBaiIBvU
xjNW1KrGT1lRGzpoUBs7qKiNNYpaiJqKQW1Yx6BW5+zrKGq1jvtmwKA2XLtBbbgXitpYoqgND4VB
rWr8nYiiNp6yola33fVTg9owPga1ui43H4PaMPEGtWHkDWpV47GlqI3HUtTG61LUhhEzqA2jalAb
z3miViXPIWrD+BjUTk2NUTs1/ntfg1qtc+YnA+HvA0tP4O/E72OJRvF34vcx1bRyYnpvaPn+X0Ha
g6+/f5XXf3roIfZlbmRzdHJlYW0KZW5kb2JqCjIwIDAgb2JqCjw8IC9CTSAvTm9ybWFsIC9DQSAx
IC9MQyAwIC9MSiAwIC9MVyAwLjU3OSAvTUwgNCAvU0EgdHJ1ZSAvVHlwZSAvRXh0R1N0YXRlIC9j
YSAxID4+CmVuZG9iagoyMSAwIG9iago8PCAvQmFzZUZvbnQgL0NvdXJpZXJOZXdQUy1Cb2xkTVQg
L0Rlc2NlbmRhbnRGb250cyBbIDIzIDAgUiBdIC9FbmNvZGluZyAvSWRlbnRpdHktSCAvU3VidHlw
ZSAvVHlwZTAgL1RvVW5pY29kZSAyNCAwIFIgL1R5cGUgL0ZvbnQgPj4KZW5kb2JqCjIyIDAgb2Jq
Cjw8IC9CYXNlRm9udCAvQXJpYWwtQm9sZE1UIC9EZXNjZW5kYW50Rm9udHMgWyAyNSAwIFIgXSAv
RW5jb2RpbmcgL0lkZW50aXR5LUggL1N1YnR5cGUgL1R5cGUwIC9Ub1VuaWNvZGUgMjYgMCBSIC9U
eXBlIC9Gb250ID4+CmVuZG9iagoyMyAwIG9iago8PCAvQmFzZUZvbnQgL0NvdXJpZXJOZXdQUy1C
b2xkTVQgL0NJRFN5c3RlbUluZm8gPDwgL09yZGVyaW5nIChJZGVudGl0eSkgL1JlZ2lzdHJ5IChB
ZG9iZSkgL1N1cHBsZW1lbnQgMCA+PiAvQ0lEVG9HSURNYXAgL0lkZW50aXR5IC9Gb250RGVzY3Jp
cHRvciAyNyAwIFIgL1N1YnR5cGUgL0NJREZvbnRUeXBlMiAvVHlwZSAvRm9udCAvVyBbIDAgWyA2
MDAuMDk3NyBdIF0gPj4KZW5kb2JqCjI0IDAgb2JqCjw8IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlIC9M
ZW5ndGggMzE1ID4+CnN0cmVhbQp4nF2Sy26DMBBF9/4KL9NFBOaVVkJICUkkFn2otB9A7CG1VIxl
nAV/XzNDU6mWsHSYuTPXY0d1c2yM9jx6c6NswfNeG+VgGm9OAr/AVRsmEq609CvhLofOsiiI23ny
MDSmH1lZch69h+jk3cw3ezVe4IFFr06B0+bKN591G7i9WfsNAxjPY1ZVXEEfKj139qUbgEco2zYq
xLWft0Hzl/ExW+AJsiA3clQw2U6C68wVWBmHVfHyHFbFwKh/cbHKLr386hympyE9jvdxhfSIlORE
Z6IaSQiiE9FpoXRHlDxhLCuQ0h1SniFlGVIhiAqilIj6FdTvsGQmsTii9dVj+uv4fsLsQM1q0j5S
JfKa03EKspzn9JP87JK1LlVaprPc4n308uZcmDpeNY57GbQ2cH8NdrSLavl+AEUMoIVlbmRzdHJl
YW0KZW5kb2JqCjI1IDAgb2JqCjw8IC9CYXNlRm9udCAvQXJpYWwtQm9sZE1UIC9DSURTeXN0ZW1J
bmZvIDw8IC9PcmRlcmluZyAoSWRlbnRpdHkpIC9SZWdpc3RyeSAoQWRvYmUpIC9TdXBwbGVtZW50
IDAgPj4gL0NJRFRvR0lETWFwIC9JZGVudGl0eSAvRm9udERlc2NyaXB0b3IgMjkgMCBSIC9TdWJ0
eXBlIC9DSURGb250VHlwZTIgL1R5cGUgL0ZvbnQgL1cgWyAwIFsgNzUwIF0gMSA2NyAyNzcuODMy
IDY4IFsgNTU2LjE1MjMgMCAwIDYxMC44Mzk4IDU1Ni4xNTIzIDAgNjEwLjgzOTggNjEwLjgzOTgg
Mjc3LjgzMiAwIDAgMjc3LjgzMiA4ODkuMTYwMiBdIDgxIDg0IDYxMC44Mzk4IDg1IFsgMzg5LjE2
MDIgNTU2LjE1MjMgMzMzLjAwNzggNjEwLjgzOTggMCA3NzcuODMyIF0gXSA+PgplbmRvYmoKMjYg
MCBvYmoKPDwgL0ZpbHRlciAvRmxhdGVEZWNvZGUgL0xlbmd0aCAyOTIgPj4Kc3RyZWFtCnicXZHb
asMwDIbv/RS67C5KDnOaDUKgZCvkYgeW9QFSW+kMi2Mc9yJvP0fqOpjBgc/S/0uRkqZ9aq0JkLz7
SXUYYDBWe5yni1cIJzwbK7IctFHhSvRVY+9EEsXdMgccWztMoqoAko8YnYNfYLPX0wnvRPLmNXpj
z7A5Nl3k7uLcN45oA6SirkHjEJ1eevfajwgJybatjnETlm3U/GV8Lg4hJ864GzVpnF2v0Pf2jKJK
46mhOsRTC7T6X7xg1WlQX72n7PuYnab7tF4py4jyZ6K8IZKPRFIS7TKiYk9UllTl6id/3W/NyJIt
Hlgr2Ym1ku13JT8eiAruZ9dwlYIfWV7m12Jsv/7duoXb6NTF+zg1WhWNax2UsXjbppvcqlrvDxtZ
lBVlbmRzdHJlYW0KZW5kb2JqCjI3IDAgb2JqCjw8IC9Bc2NlbnQgODMyLjUxOTUgL0NhcEhlaWdo
dCAwIC9EZXNjZW50IC0zMDAuMjkzIC9GbGFncyA1IC9Gb250QkJveCBbIC00Ni4zODY3IC03MTAu
NDQ5MiA3MDEuNjYwMiAxMjIxLjE5MTQgXSAvRm9udEZpbGUyIDI4IDAgUiAvRm9udE5hbWUgL0Nv
dXJpZXJOZXdQUy1Cb2xkTVQgL0l0YWxpY0FuZ2xlIDAgL1N0ZW1WIDE2MC4xNTYzIC9UeXBlIC9G
b250RGVzY3JpcHRvciA+PgplbmRvYmoKMjggMCBvYmoKPDwgL0ZpbHRlciAvRmxhdGVEZWNvZGUg
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
zS1CtuDX9ttFNTbMb+AbAhMxbrGn5fLWNs0qZkMWotGzGCaycFZjQ+tczge0NHHPr1mqYv1QVfNS
Lrg+CZ3JSMijYnbf5mqalqoLFta3Cja1niZYW5O+gxZ93WJw61zPwsY6mOaiBjgEt4Hfb5+Pgybr
G+BHmsb4uN49Yllg0FZT29anY76xGn3Vs89OViy5d0JtTZM6q76HEPjUtBXyAVMnl6iZ6sCheUPS
1CHZQzNdeS6Xv//UsWh0ZWfn5aEckjtEHTI4vyC/IChgbltbc6HTuXjx4qz5PYqv9cy/wIOV1qlj
69vaGutbyupbG+Zw863hJsPHLG6BilpUYcV86RUjx2WoPZFiMYZx42ypgZJgliV1LQ1Y7agWRJ85
fJY2QZ1c3whzb4EFIeRwf1bVEk69oRamMrthCRg2N7TVzlXrBP8MVayQGzmiwOJ6rhPhqK2NNbME
idkiTHDdNcP71KmtmhXVz1/YWMMNoG/hnoVtzQvbxEpa6hFzuFG21czCOM3eBN22+tq5TWIxdZ7a
hVwFwgizziEz59y2+Y3O+W1NNfPrnfNbZ9Zq4miqX5zFe/7LWYvrG9Fa/5+n8DunbiRi9DnfguG1
lpzy4/hco9poIQvCIfTNOUfMFsnGuXpH6YngOfrlm+SX5NfkV1Bu/o8rbfi3K70QLdqjikeMXHjO
kaNFitjzKMuTpHOv/hscxJfTSVD9Bj3nGneRoHSu3gtEErRISOrcoybob6nwhz8tNVr6X0nknKtX
rMoIZZhSqgxWhipuZbgyVik4J8Up/1HPY/kuWDbGnHuEli5efu41sVD6h2xHInNuLXrEg2sNEf1f
MDhI9WVuZHN0cmVhbQplbmRvYmoKMjkgMCBvYmoKPDwgL0FzY2VudCA5MDUuMjczNCAvQ2FwSGVp
Z2h0IDcxNS44MjAzIC9EZXNjZW50IC0yMTEuOTE0MSAvRmxhZ3MgNCAvRm9udEJCb3ggWyAtNjI3
LjkyOTcgLTM3Ni40NjQ4IDIwMzMuNjkxNCAxMDQ3Ljg1MTYgXSAvRm9udEZpbGUyIDMwIDAgUiAv
Rm9udE5hbWUgL0FyaWFsLUJvbGRNVCAvSXRhbGljQW5nbGUgMCAvU3RlbVYgMTM3LjIwNyAvVHlw
ZSAvRm9udERlc2NyaXB0b3IgPj4KZW5kb2JqCjMwIDAgb2JqCjw8IC9GaWx0ZXIgL0ZsYXRlRGVj
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
ZHMgWyAzNSAwIFIgMSAwIFIgOCAwIFIgMTAgMCBSIDEyIDAgUiAxNCAwIFIgMTYgMCBSIDE4IDAg
UiBdIC9UeXBlIC9QYWdlcyA+PgplbmRvYmoKeHJlZgowIDMyCjAwMDAwMDAwMDAgNjU1MzUgZiAK
MDAwMDA3ODU1NCAwMDAwMCBuIAowMDAwMDc4NzkzIDAwMDAwIG4gCjAwMDAwNzg5MzQgMDAwMDAg
biAKMDAwMDA5MTMxOCAwMDAwMCBuIAowMDAwMDkxNzE1IDAwMDAwIG4gCjAwMDAwOTIwNjUgMDAw
MDAgbiAKMDAwMDA5MjMwMSAwMDAwMCBuIAowMDAwMTA3Mjg1IDAwMDAwIG4gCjAwMDAxMDc1MzYg
MDAwMDAgbiAKMDAwMDExODcwNCAwMDAwMCBuIAowMDAwMTE4OTQ2IDAwMDAwIG4gCjAwMDAxMzIy
MTYgMDAwMDAgbiAKMDAwMDEzMjQ4MCAwMDAwMCBuIAowMDAwMTQyOTA0IDAwMDAwIG4gCjAwMDAx
NDMxMjQgMDAwMDAgbiAKMDAwMDE1Njk0NiAwMDAwMCBuIAowMDAwMTU3MTY2IDAwMDAwIG4gCjAw
MDAxNjUwNzggMDAwMDAgbiAKMDAwMDE2NTI5OCAwMDAwMCBuIAowMDAwMTY2Njk2IDAwMDAwIG4g
CjAwMDAxNjY3OTYgMDAwMDAgbiAKMDAwMDE2Njk0NSAwMDAwMCBuIAowMDAwMTY3MDg3IDAwMDAw
IG4gCjAwMDAxNjczMTcgMDAwMDAgbiAKMDAwMDE2NzcwNCAwMDAwMCBuIAowMDAwMTY4MDkwIDAw
MDAwIG4gCjAwMDAxNjg0NTQgMDAwMDAgbiAKMDAwMDE2ODY4NyAwMDAwMCBuIAowMDAwMTg2Njk2
IDAwMDAwIG4gCjAwMDAxODY5MzEgMDAwMDAgbiAKMDAwMDIwNDI2NCAwMDAwMCBuIAp0cmFpbGVy
IDw8IC9TaXplIDMyIC9JRCBbPDMxNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1PjwzMTQx
NTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NT5dID4+CnN0YXJ0eHJlZgoyMTYKJSVFT0YK
--047d7b624e9aa410da05200b4883--
.
Author: Patrice Roy <patricer@gmail.com>
Date: Fri, 18 Sep 2015 16:45:54 -0400
Raw View
--047d7bdc12ea37b9e405200b9ea9
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
This would be useful (if it were possible to make it work without dynamic
memory allocation) for exception messages with variable components, as
using a std::string for that purpose is unpleasant (risks of bad_alloc
while building the exception and such), but I doubt this is feasible in
practice. What would be the actual type of such an interpolated string?
Would it reserve space for the sum of the worst-case for its =C2=ABvariable
components=C2=BB? How much space would be allocated for arbitrary classes w=
ith
implicit conversion to string or other niceties?
So many questions... :)
Cheers!
2015-09-18 16:21 GMT-04:00 Andrew Tomazos <andrewtomazos@gmail.com>:
> Please find attached a very very rough draft of a proposal entitled
> "Interpolated String Literals".
>
> Mainly after encouragement or discouragement, and any high-level thoughts
> you might have about it.
>
> --
>
> ---
> You received this message because you are subscribed to the Google Groups
> "ISO C++ Standard - Future Proposals" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to std-proposals+unsubscribe@isocpp.org.
> To post to this group, send email to std-proposals@isocpp.org.
> Visit this group at
> http://groups.google.com/a/isocpp.org/group/std-proposals/.
>
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
--047d7bdc12ea37b9e405200b9ea9
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div>This would be useful (if it were possible to make it =
work without dynamic memory allocation)=C2=A0 for exception messages with v=
ariable components, as using a std::string for that purpose is unpleasant (=
risks of bad_alloc while building the exception and such), but I doubt this=
is feasible in practice. What would be the actual type of such an interpol=
ated string? Would it reserve space for the sum of the worst-case for its =
=C2=ABvariable components=C2=BB? How much space would be allocated for arbi=
trary classes with implicit conversion to string or other niceties?<br><br>=
</div><div>So many questions... :)<br></div><div><br></div>Cheers!<br></div=
><div class=3D"gmail_extra"><br><div class=3D"gmail_quote">2015-09-18 16:21=
GMT-04:00 Andrew Tomazos <span dir=3D"ltr"><<a href=3D"mailto:andrewtom=
azos@gmail.com" target=3D"_blank">andrewtomazos@gmail.com</a>></span>:<b=
r><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:=
1px #ccc solid;padding-left:1ex"><div dir=3D"ltr">Please find attached a ve=
ry very rough draft of a proposal entitled "Interpolated String Litera=
ls".<div><br></div><div>Mainly after encouragement or discouragement, =
and any high-level thoughts you might have about it.</div><span class=3D"HO=
EnZb"><font color=3D"#888888"><div><br></div></font></span></div><span clas=
s=3D"HOEnZb"><font color=3D"#888888">
<p></p>
-- <br>
<br>
--- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org" target=3D"_=
blank">std-proposals+unsubscribe@isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br>
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/" target=3D"_blank">http://groups.google.com/a/isocpp.org/gro=
up/std-proposals/</a>.<br>
</font></span></blockquote></div><br></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--047d7bdc12ea37b9e405200b9ea9--
.
Author: Andrew Tomazos <andrewtomazos@gmail.com>
Date: Fri, 18 Sep 2015 23:26:02 +0200
Raw View
--001a11c26816b9f1e905200c2d05
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
On Fri, Sep 18, 2015 at 10:45 PM, Patrice Roy <patricer@gmail.com> wrote:
> This would be useful (if it were possible to make it work without dynamic
> memory allocation) for exception messages with variable components, as
> using a std::string for that purpose is unpleasant (risks of bad_alloc
> while building the exception and such), but I doubt this is feasible in
> practice. What would be the actual type of such an interpolated string?
> Would it reserve space for the sum of the worst-case for its =C2=ABvariab=
le
> components=C2=BB? How much space would be allocated for arbitrary classes=
with
> implicit conversion to string or other niceties?
>
> So many questions... :)
>
As proposed an interpolated string literal isn't an expression as such, it
produces a sequence of tokens such that it will provide the operator and
RHS of an << binary expression. The tokens include a mixture of ordinary
literal strings and expressions, just like in a normal << iostreams
statement.
> Cheers!
>
> 2015-09-18 16:21 GMT-04:00 Andrew Tomazos <andrewtomazos@gmail.com>:
>
>> Please find attached a very very rough draft of a proposal entitled
>> "Interpolated String Literals".
>>
>> Mainly after encouragement or discouragement, and any high-level thought=
s
>> you might have about it.
>>
>> --
>>
>> ---
>> You received this message because you are subscribed to the Google Group=
s
>> "ISO C++ Standard - Future Proposals" group.
>> To unsubscribe from this group and stop receiving emails from it, send a=
n
>> email to std-proposals+unsubscribe@isocpp.org.
>> To post to this group, send email to std-proposals@isocpp.org.
>> Visit this group at
>> http://groups.google.com/a/isocpp.org/group/std-proposals/.
>>
>
> --
>
> ---
> You received this message because you are subscribed to the Google Groups
> "ISO C++ Standard - Future Proposals" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to std-proposals+unsubscribe@isocpp.org.
> To post to this group, send email to std-proposals@isocpp.org.
> Visit this group at
> http://groups.google.com/a/isocpp.org/group/std-proposals/.
>
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
--001a11c26816b9f1e905200c2d05
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div class=3D"gmail_extra"><div class=3D"gmail_quote">On F=
ri, Sep 18, 2015 at 10:45 PM, Patrice Roy <span dir=3D"ltr"><<a href=3D"=
mailto:patricer@gmail.com" target=3D"_blank">patricer@gmail.com</a>></sp=
an> wrote:<br><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;=
border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div>This wou=
ld be useful (if it were possible to make it work without dynamic memory al=
location)=C2=A0 for exception messages with variable components, as using a=
std::string for that purpose is unpleasant (risks of bad_alloc while build=
ing the exception and such), but I doubt this is feasible in practice. What=
would be the actual type of such an interpolated string? Would it reserve =
space for the sum of the worst-case for its =C2=ABvariable components=C2=BB=
? How much space would be allocated for arbitrary classes with implicit con=
version to string or other niceties?<br><br></div><div>So many questions...=
:)</div></div></blockquote><div><br></div><div>As proposed an interpolated=
string literal isn't an expression as such, it produces a sequence of =
tokens such that it will provide the operator and RHS of an << binary=
expression.=C2=A0 The tokens include a mixture of ordinary literal strings=
and expressions, just like in a normal << iostreams statement.</div>=
<div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8=
ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div></div=
>Cheers!<br></div><div class=3D"gmail_extra"><br><div class=3D"gmail_quote"=
><span class=3D"">2015-09-18 16:21 GMT-04:00 Andrew Tomazos <span dir=3D"lt=
r"><<a href=3D"mailto:andrewtomazos@gmail.com" target=3D"_blank">andrewt=
omazos@gmail.com</a>></span>:<br></span><blockquote class=3D"gmail_quote=
" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><=
span class=3D""><div dir=3D"ltr">Please find attached a very very rough dra=
ft of a proposal entitled "Interpolated String Literals".<div><br=
></div><div>Mainly after encouragement or discouragement, and any high-leve=
l thoughts you might have about it.</div><span><font color=3D"#888888"><div=
><br></div></font></span></div></span><span class=3D"HOEnZb"><font color=3D=
"#888888"><span><font color=3D"#888888">
<p></p>
-- <br>
<br>
--- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org" target=3D"_=
blank">std-proposals+unsubscribe@isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br>
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/" target=3D"_blank">http://groups.google.com/a/isocpp.org/gro=
up/std-proposals/</a>.<br>
</font></span></font></span></blockquote></div><span class=3D"HOEnZb"><font=
color=3D"#888888"><br></font></span></div><span class=3D"HOEnZb"><font col=
or=3D"#888888">
<p></p>
-- <br>
<br>
--- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org" target=3D"_=
blank">std-proposals+unsubscribe@isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br>
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/" target=3D"_blank">http://groups.google.com/a/isocpp.org/gro=
up/std-proposals/</a>.<br>
</font></span></blockquote></div><br></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--001a11c26816b9f1e905200c2d05--
.
Author: Miro Knejp <miro.knejp@gmail.com>
Date: Sat, 19 Sep 2015 00:04:27 +0200
Raw View
This is a multi-part message in MIME format.
--------------040305090009090809080803
Content-Type: text/plain; charset=UTF-8; format=flowed
Nice, I wanted this so many times already.
But there are a few points I find a bit strange.
(1) I don't think operator<< is the right choice. With your proposal it
means I cannot do the very basic thing that works in every language with
string interpolation:
std::string s = F"% Hello %i World!";
auto s = F"% Hello %i World!"; // What is auto?
Any proposal that cannot get the above two lines to "just work" with
standard types is simply not good enough in my oppinion.
I believe to make this work properly one needs some other infrastructure
to exist first. There has to be a way to pass the expression to be
formatted to some function that knows how to format it? Last time I used
string interpolation was in Scala, where the literal prefix is actually
the name of a function to call with the transformed string. I don't know
whether we can ever introduce user defined string prefixes, but who
knows. However, I think for now, a more flexible way is to combine both
prefix and suffix. Let me try to explain with an example using your
syntax where applicable:
auto s = F"% Hello %i World: %{x == 1 ? "a" : "b"}!"_my_string;
This is translated to something like:
auto&& __context = operator""_my_string();
__context("Hello ");
__context(i);
__context(" World: ");
__context(x == 1 ? "a" : "b"); // Note the correct handling of literals
inside %{ }
__context("!");
auto s = move(__context).get();d
Whatever x this UDL returns must make the expression x(expr) well-formed
for every expr that is an embedded expression of the string literal, or
an actual string literal. Unfortunately this requires that a string
literal with *only* the introducing prefix is ill-formed, unless we make
the exception that a lacking suffix uses a standard-library context that
produces a std::string (whether this is a good idea is debatable, but it
sure as hell would be friggin' convenient). Assuming no exceptions the
get() method is invoked exactly once and therefore can use this
knowledge to move the result out of the object. The move() helps to
prefer an rvalue-qualified overload if one exists.
The UDL is declared as usual but takes no parameters:
MyStringBuilder operator""_my_string();
This suggests that the context cannot take constructor parameter, which
may be a severe limitation. If constructor arguments are desirable then
it would certainly need a syntax that distinguishes this UDL from others
(or find a solution other than UDLs). An interpolated string that is
used for a purpose other than being stored in some location (like
performing output) it is more efficient to perform the output directly,
which I guess is the motivation of using operator<<. A context that can
take parameters could make this possible, for example using
llvm::raw_ostream (a faster alternative to std::ostream):
using namespace llvm;
raw_ostream out;
F"% Hello %i World: %{x == 1 ? "a" : "b"}!"_raw_ostream{out};
Using a wrapper around raw_ostream that uses operator() instead of
operator<< can directly insert into the stream with zero overhead
compared to a handwritten sequence of statements (same applies for
std::ostream). What is weird about this syntax, though, is the placement
of the "thing" that does the actual work at the end of the expression
instead of the front as it were in a function call. Your approach with
the receiving object at the front makes it at least *look* better. Maybe
these can somehow be combined.
Regardless of whether my approach here works or not, I think a solution
that is not directly coupled to a certain operator (except the call
operator) is less restricted and far more flexible. Function objects are
way more common than insertion operators and maybe we can slow down the
spreading abuse of operator<< . I know of some classes that could be an
immediate drop-in and would "just work" with minimal adjustments. If the
standard-provided string context uses ADL-based lookup to (for example)
to_string(x), or to_string(context, x), you have a convenient
customization point to support the default string interpolation.
(2) Even if you stick to operator<< I find it *very* disturbing that
there is no << between cout and the literal.
cout F"% ..."; // Where's the operator? No call parens? Am I blind? Is
the sky falling?
cout << F"% ..."; // Ah, there it is!
It also means that with your approach I couldn't pass the result of the
interpolated literal as function parameter.
foo(F"% ...") // ill-formed: foo(<< "...")
(Which would be also ill-formed if the compiler can't find a matching
operator<<, but that's a different issue.)
It has to be as convenient and flexible as possible for the end-user.
(3) I think it's very strange to have the escaping character be part of
the string literal. To me it lacks a clear separation between the actual
literal content and the introducer. Look at raw literals:
R"delimiter(...)delimiter" where there is a clearly visible distinction
between "content" and "non-content". Not sure how to do this properly,
especially regarding the next point:
(4) How does this combine with the other literal prefixes, like R?
(5) There are actually two proposals in there: string interpolation and
multiline literals. Those are completely orthogonal and you don't need
the one to implement the other. You'd be better off making these two
separate (independent) proposals.
Am 18.09.2015 um 22:21 schrieb Andrew Tomazos:
> Please find attached a very very rough draft of a proposal entitled
> "Interpolated String Literals".
>
> Mainly after encouragement or discouragement, and any high-level
> thoughts you might have about it.
>
> --
>
> ---
> You received this message because you are subscribed to the Google
> Groups "ISO C++ Standard - Future Proposals" group.
> To unsubscribe from this group and stop receiving emails from it, send
> an email to std-proposals+unsubscribe@isocpp.org
> <mailto:std-proposals+unsubscribe@isocpp.org>.
> To post to this group, send email to std-proposals@isocpp.org
> <mailto:std-proposals@isocpp.org>.
> Visit this group at
> http://groups.google.com/a/isocpp.org/group/std-proposals/.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
--------------040305090009090809080803
Content-Type: text/html; charset=UTF-8
<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
Nice, I wanted this so many times already.<br>
<br>
But there are a few points I find a bit strange.<br>
<br>
(1) I don't think operator<< is the right choice. With your
proposal it means I cannot do the very basic thing that works in
every language with string interpolation:<br>
std::string s = F"% Hello %i World!";<br>
auto s = F"% Hello %i World!"; // What is auto?<br>
Any proposal that cannot get the above two lines to "just work" with
standard types is simply not good enough in my oppinion.<br>
<br>
I believe to make this work properly one needs some other
infrastructure to exist first. There has to be a way to pass the
expression to be formatted to some function that knows how to format
it? Last time I used string interpolation was in Scala, where the
literal prefix is actually the name of a function to call with the
transformed string. I don't know whether we can ever introduce user
defined string prefixes, but who knows. However, I think for now, a
more flexible way is to combine both prefix and suffix. Let me try
to explain with an example using your syntax where applicable:<br>
<br>
auto s = F"% Hello %i World: %{x == 1 ? "a" : "b"}!"_my_string;<br>
<br>
This is translated to something like:<br>
auto&& __context = operator""_my_string();<br>
__context("Hello ");<br>
__context(i);<br>
__context(" World: ");<br>
__context(x == 1 ? "a" : "b"); // Note the correct handling of
literals inside %{ }<br>
__context("!");<br>
auto s = move(__context).get();d<br>
<br>
Whatever x this UDL returns must make the expression x(expr)
well-formed for every expr that is an embedded expression of the
string literal, or an actual string literal. Unfortunately this
requires that a string literal with *only* the introducing prefix is
ill-formed, unless we make the exception that a lacking suffix uses
a standard-library context that produces a std::string (whether this
is a good idea is debatable, but it sure as hell would be friggin'
convenient). Assuming no exceptions the get() method is invoked
exactly once and therefore can use this knowledge to move the result
out of the object. The move() helps to prefer an rvalue-qualified
overload if one exists.<br>
<br>
The UDL is declared as usual but takes no parameters:<br>
<br>
MyStringBuilder operator""_my_string();<br>
<br>
This suggests that the context cannot take constructor parameter,
which may be a severe limitation. If constructor arguments are
desirable then it would certainly need a syntax that distinguishes
this UDL from others (or find a solution other than UDLs). An
interpolated string that is used for a purpose other than being
stored in some location (like performing output) it is more
efficient to perform the output directly, which I guess is the
motivation of using operator<<. A context that can take
parameters could make this possible, for example using
llvm::raw_ostream (a faster alternative to std::ostream):<br>
<br>
using namespace llvm;<br>
raw_ostream out;<br>
F"% Hello %i World: %{x == 1 ? "a" : "b"}!"_raw_ostream{out};<br>
<br>
Using a wrapper around raw_ostream that uses operator() instead of
operator<< can directly insert into the stream with zero
overhead compared to a handwritten sequence of statements (same
applies for std::ostream). What is weird about this syntax, though,
is the placement of the "thing" that does the actual work at the end
of the expression instead of the front as it were in a function
call. Your approach with the receiving object at the front makes it
at least *look* better. Maybe these can somehow be combined.<br>
<br>
Regardless of whether my approach here works or not, I think a
solution that is not directly coupled to a certain operator (except
the call operator) is less restricted and far more flexible.
Function objects are way more common than insertion operators and
maybe we can slow down the spreading abuse of operator<< . I
know of some classes that could be an immediate drop-in and would
"just work" with minimal adjustments. If the standard-provided
string context uses ADL-based lookup to (for example) to_string(x),
or to_string(context, x), you have a convenient customization point
to support the default string interpolation.<br>
<br>
(2) Even if you stick to operator<< I find it *very*
disturbing that there is no << between cout and the literal.<br>
<br>
cout F"% ..."; // Where's the operator? No call parens? Am I blind?
Is the sky falling?<br>
cout << F"% ..."; // Ah, there it is!<br>
<br>
It also means that with your approach I couldn't pass the result of
the interpolated literal as function parameter.<br>
<br>
foo(F"% ...") // ill-formed: foo(<< "...")<br>
<br>
(Which would be also ill-formed if the compiler can't find a
matching operator<<, but that's a different issue.)<br>
<br>
It has to be as convenient and flexible as possible for the
end-user.<br>
<br>
(3) I think it's very strange to have the escaping character be part
of the string literal. To me it lacks a clear separation between the
actual literal content and the introducer. Look at raw literals:
R"delimiter(...)delimiter" where there is a clearly visible
distinction between "content" and "non-content". Not sure how to do
this properly, especially regarding the next point:<br>
<br>
(4) How does this combine with the other literal prefixes, like R?<br>
<br>
(5) There are actually two proposals in there: string interpolation
and multiline literals. Those are completely orthogonal and you
don't need the one to implement the other. You'd be better off
making these two separate (independent) proposals.<br>
<br>
<div class="moz-cite-prefix">Am 18.09.2015 um 22:21 schrieb Andrew
Tomazos:<br>
</div>
<blockquote
cite="mid:CAB+4KHKxwEPXSFScU-FjeUL=yQFZWGfm6uk5fbh1+9bfScL_2Q@mail.gmail.com"
type="cite">
<div dir="ltr">Please find attached a very very rough draft of a
proposal entitled "Interpolated String Literals".
<div><br>
</div>
<div>Mainly after encouragement or discouragement, and any
high-level thoughts you might have about it.</div>
<div><br>
</div>
</div>
-- <br>
<br>
--- <br>
You received this message because you are subscribed to the Google
Groups "ISO C++ Standard - Future Proposals" group.<br>
To unsubscribe from this group and stop receiving emails from it,
send an email to <a moz-do-not-send="true"
href="mailto:std-proposals+unsubscribe@isocpp.org">std-proposals+unsubscribe@isocpp.org</a>.<br>
To post to this group, send email to <a moz-do-not-send="true"
href="mailto:std-proposals@isocpp.org">std-proposals@isocpp.org</a>.<br>
Visit this group at <a moz-do-not-send="true"
href="http://groups.google.com/a/isocpp.org/group/std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/</a>.<br>
</blockquote>
<br>
</body>
</html>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an email to <a href="mailto:std-proposals+unsubscribe@isocpp.org">std-proposals+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href="mailto:std-proposals@isocpp.org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href="http://groups.google.com/a/isocpp.org/group/std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/</a>.<br />
--------------040305090009090809080803--
.
Author: Bengt Gustafsson <bengt.gustafsson@beamways.com>
Date: Sat, 19 Sep 2015 03:33:17 -0700 (PDT)
Raw View
------=_Part_1875_331683846.1442658797789
Content-Type: multipart/alternative;
boundary="----=_Part_1876_1267557028.1442658797790"
------=_Part_1876_1267557028.1442658797790
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
I like the basic idea, but here are some comments:
- Do we really need to be able to specify the introducer character. Can't %=
=20
be fixed (with the usual %% escape possibility).
- Wouldn't it be more logical if this resulted in an expanded pack, i.e. a=
=20
number of comma separated parts. The use would then be:
std::string goods =3D "cars";
int count =3D 43;
format(std::cout, F"The number of %goods is %count");
which calls a:
template<typename... Ps> void format(ostream&, Ps&&...);
Arbitrarily reusing << is a little bit to much of a hack for my taste.=20
Expanding as a pack to be picked up by a variadic template seems more like=
=20
modern C++. The upcoming ... << ... type pack expansions
of C++17 would make the implementation of format a breeze.
Even with a << expansion I would prefer not to introduce an prefix one at=
=20
the left, it seems more logical to write it out explicitly.
- Translation is an important issue.
There are utilities which scan the source code to find typically=20
_("string") literals which get translated. This does not seem to play well=
=20
with
this suggestion. Translation is probably the most important reason for=20
placing the inserts after the string literal in printf and similar, and=20
this makes inline systems like shifting out on cout
much harder to translate, and this suggested system even worse, as the=20
parts of the literal can't be "addressed" at runtime so there is no chance=
=20
of replacing the string with a translation.
Translation is also a main driver behind prefering named inserts, as=20
different languages tend to want to reorder inserted words to get a=20
grammatically correct sentence.
This said there are of course uses when translation is not an issue, but=20
I'm a bit worried that making untranslatable strings so much easier to use=
=20
than translatable strings will make American programmers (who are as lazy=
=20
as all programmers and create many of the most used softwares) conveniently=
=20
forget about the needs for translation.
Of course it is still possible to make a preprocessor which actually=20
mangles the source code inserting the foreign string, but we want to move=
=20
away from those ideas towards being able to change language at runtime.
Den l=C3=B6rdag 19 september 2015 kl. 00:04:23 UTC+2 skrev Miro Knejp:
>
> Nice, I wanted this so many times already.
>
> But there are a few points I find a bit strange.
>
> (1) I don't think operator<< is the right choice. With your proposal it=
=20
> means I cannot do the very basic thing that works in every language with=
=20
> string interpolation:
> std::string s =3D F"% Hello %i World!";
> auto s =3D F"% Hello %i World!"; // What is auto?
> Any proposal that cannot get the above two lines to "just work" with=20
> standard types is simply not good enough in my oppinion.
>
> I believe to make this work properly one needs some other infrastructure=
=20
> to exist first. There has to be a way to pass the expression to be=20
> formatted to some function that knows how to format it? Last time I used=
=20
> string interpolation was in Scala, where the literal prefix is actually t=
he=20
> name of a function to call with the transformed string. I don't know=20
> whether we can ever introduce user defined string prefixes, but who knows=
..=20
> However, I think for now, a more flexible way is to combine both prefix a=
nd=20
> suffix. Let me try to explain with an example using your syntax where=20
> applicable:
>
> auto s =3D F"% Hello %i World: %{x =3D=3D 1 ? "a" : "b"}!"_my_string;
>
> This is translated to something like:
> auto&& __context =3D operator""_my_string();
> __context("Hello ");
> __context(i);
> __context(" World: ");
> __context(x =3D=3D 1 ? "a" : "b"); // Note the correct handling of litera=
ls=20
> inside %{ }
> __context("!");
> auto s =3D move(__context).get();d
>
> Whatever x this UDL returns must make the expression x(expr) well-formed=
=20
> for every expr that is an embedded expression of the string literal, or a=
n=20
> actual string literal. Unfortunately this requires that a string literal=
=20
> with *only* the introducing prefix is ill-formed, unless we make the=20
> exception that a lacking suffix uses a standard-library context that=20
> produces a std::string (whether this is a good idea is debatable, but it=
=20
> sure as hell would be friggin' convenient). Assuming no exceptions the=20
> get() method is invoked exactly once and therefore can use this knowledge=
=20
> to move the result out of the object. The move() helps to prefer an=20
> rvalue-qualified overload if one exists.
>
> The UDL is declared as usual but takes no parameters:
>
> MyStringBuilder operator""_my_string();
>
> This suggests that the context cannot take constructor parameter, which=
=20
> may be a severe limitation. If constructor arguments are desirable then i=
t=20
> would certainly need a syntax that distinguishes this UDL from others (or=
=20
> find a solution other than UDLs). An interpolated string that is used for=
a=20
> purpose other than being stored in some location (like performing output)=
=20
> it is more efficient to perform the output directly, which I guess is the=
=20
> motivation of using operator<<. A context that can take parameters could=
=20
> make this possible, for example using llvm::raw_ostream (a faster=20
> alternative to std::ostream):
>
> using namespace llvm;
> raw_ostream out;
> F"% Hello %i World: %{x =3D=3D 1 ? "a" : "b"}!"_raw_ostream{out};
>
> Using a wrapper around raw_ostream that uses operator() instead of=20
> operator<< can directly insert into the stream with zero overhead compare=
d=20
> to a handwritten sequence of statements (same applies for std::ostream).=
=20
> What is weird about this syntax, though, is the placement of the "thing"=
=20
> that does the actual work at the end of the expression instead of the fro=
nt=20
> as it were in a function call. Your approach with the receiving object at=
=20
> the front makes it at least *look* better. Maybe these can somehow be=20
> combined.
>
> Regardless of whether my approach here works or not, I think a solution=
=20
> that is not directly coupled to a certain operator (except the call=20
> operator) is less restricted and far more flexible. Function objects are=
=20
> way more common than insertion operators and maybe we can slow down the=
=20
> spreading abuse of operator<< . I know of some classes that could be an=
=20
> immediate drop-in and would "just work" with minimal adjustments. If the=
=20
> standard-provided string context uses ADL-based lookup to (for example)=
=20
> to_string(x), or to_string(context, x), you have a convenient customizati=
on=20
> point to support the default string interpolation.
>
> (2) Even if you stick to operator<< I find it *very* disturbing that ther=
e=20
> is no << between cout and the literal.
>
> cout F"% ..."; // Where's the operator? No call parens? Am I blind? Is th=
e=20
> sky falling?
> cout << F"% ..."; // Ah, there it is!
>
> It also means that with your approach I couldn't pass the result of the=
=20
> interpolated literal as function parameter.
>
> foo(F"% ...") // ill-formed: foo(<< "...")
>
> (Which would be also ill-formed if the compiler can't find a matching=20
> operator<<, but that's a different issue.)
>
> It has to be as convenient and flexible as possible for the end-user.
>
> (3) I think it's very strange to have the escaping character be part of=
=20
> the string literal. To me it lacks a clear separation between the actual=
=20
> literal content and the introducer. Look at raw literals:=20
> R"delimiter(...)delimiter" where there is a clearly visible distinction=
=20
> between "content" and "non-content". Not sure how to do this properly,=20
> especially regarding the next point:
>
> (4) How does this combine with the other literal prefixes, like R?
>
> (5) There are actually two proposals in there: string interpolation and=
=20
> multiline literals. Those are completely orthogonal and you don't need th=
e=20
> one to implement the other. You'd be better off making these two separate=
=20
> (independent) proposals.
>
> Am 18.09.2015 um 22:21 schrieb Andrew Tomazos:
>
> Please find attached a very very rough draft of a proposal entitled=20
> "Interpolated String Literals".=20
>
> Mainly after encouragement or discouragement, and any high-level thoughts=
=20
> you might have about it.
>
> --=20
>
> ---=20
> You received this message because you are subscribed to the Google Groups=
=20
> "ISO C++ Standard - Future Proposals" group.
> To unsubscribe from this group and stop receiving emails from it, send an=
=20
> email to std-proposal...@isocpp.org <javascript:>.
> To post to this group, send email to std-pr...@isocpp.org <javascript:>.
> Visit this group at=20
> http://groups.google.com/a/isocpp.org/group/std-proposals/.
>
>
>
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
------=_Part_1876_1267557028.1442658797790
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">I like the basic idea, but here are some comments:<div><br=
></div><div>- Do we really need to be able to specify the introducer charac=
ter. Can't % be fixed (with the usual %% escape possibility).</div><div=
><br></div><div>- Wouldn't it be more logical if this resulted in an ex=
panded pack, i.e. a number of comma separated parts. The use would then be:=
</div><div><br></div><div>std::string goods =3D "cars";</div><div=
>int count =3D 43;</div><div>format(std::cout, F"The number of %goods =
is %count");</div><div><br></div><div>which calls a:</div><div><br></d=
iv><div>template<typename... Ps> void format(ostream&, Ps&&am=
p;...);</div><div><br></div><div>Arbitrarily reusing << is a little b=
it to much of a hack for my taste. Expanding as a pack to be picked up by a=
variadic template seems more like modern C++. The upcoming ... << ..=
.. type pack expansions</div><div>of C++17 would make the implementation of =
format a breeze.</div><div><br></div><div>Even with a << expansion I =
would prefer not to introduce an prefix one at the left, it seems more logi=
cal to write it out explicitly.</div><div><br></div><div>- Translation is a=
n important issue.</div><div><br></div><div>There are utilities which scan =
the source code to find typically _("string") literals which get =
translated. This does not seem to play well with</div><div>this suggestion.=
Translation is probably the most important reason for placing the inserts =
after the string literal in printf and similar, and this makes inline syste=
ms like shifting out on cout</div><div>much harder to translate, and this s=
uggested system even worse, as the parts of the literal can't be "=
addressed" at runtime so there is no chance of replacing the string wi=
th a translation.</div><div><br></div><div>Translation is also a main drive=
r behind prefering named inserts, as different languages tend to want to re=
order inserted words to get a grammatically correct sentence.</div><div><br=
></div><div>This said there are of course uses when translation is not an i=
ssue, but I'm a bit worried that making untranslatable strings so much =
easier to use than translatable strings will make American programmers (who=
are as lazy as all programmers and create many of the most used softwares)=
conveniently forget about the needs for translation.</div><div><br></div><=
div>Of course it is still possible to make a preprocessor which actually ma=
ngles the source code inserting the foreign string, but we want to move awa=
y from those ideas towards being able to change language at runtime.</div><=
div><br><br>Den l=C3=B6rdag 19 september 2015 kl. 00:04:23 UTC+2 skrev Miro=
Knejp:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.=
8ex;border-left: 1px #ccc solid;padding-left: 1ex;">
=20
=20
=20
<div bgcolor=3D"#FFFFFF" text=3D"#000000">
Nice, I wanted this so many times already.<br>
<br>
But there are a few points I find a bit strange.<br>
<br>
(1) I don't think operator<< is the right choice. With your
proposal it means I cannot do the very basic thing that works in
every language with string interpolation:<br>
std::string s =3D F"% Hello %i World!";<br>
auto s =3D F"% Hello %i World!"; // What is auto?<br>
Any proposal that cannot get the above two lines to "just work&quo=
t; with
standard types is simply not good enough in my oppinion.<br>
<br>
I believe to make this work properly one needs some other
infrastructure to exist first. There has to be a way to pass the
expression to be formatted to some function that knows how to format
it? Last time I used string interpolation was in Scala, where the
literal prefix is actually the name of a function to call with the
transformed string. I don't know whether we can ever introduce user
defined string prefixes, but who knows. However, I think for now, a
more flexible way is to combine both prefix and suffix. Let me try
to explain with an example using your syntax where applicable:<br>
<br>
auto s =3D F"% Hello %i World: %{x =3D=3D 1 ? "a" : &quo=
t;b"}!"_my_string;<br>
<br>
This is translated to something like:<br>
auto&& __context =3D operator""_my_string();<br>
__context("Hello ");<br>
__context(i);<br>
__context(" World: ");<br>
__context(x =3D=3D 1 ? "a" : "b"); // Note the corr=
ect handling of
literals inside %{ }<br>
__context("!");<br>
auto s =3D move(__context).get();d<br>
<br>
Whatever x this UDL returns must make the expression x(expr)
well-formed for every expr that is an embedded expression of the
string literal, or an actual string literal. Unfortunately this
requires that a string literal with *only* the introducing prefix is
ill-formed, unless we make the exception that a lacking suffix uses
a standard-library context that produces a std::string (whether this
is a good idea is debatable, but it sure as hell would be friggin'
convenient). Assuming no exceptions the get() method is invoked
exactly once and therefore can use this knowledge to move the result
out of the object. The move() helps to prefer an rvalue-qualified
overload if one exists.<br>
<br>
The UDL is declared as usual but takes no parameters:<br>
<br>
MyStringBuilder operator""_my_string();<br>
<br>
This suggests that the context cannot take constructor parameter,
which may be a severe limitation. If constructor arguments are
desirable then it would certainly need a syntax that distinguishes
this UDL from others (or find a solution other than UDLs). An
interpolated string that is used for a purpose other than being
stored in some location (like performing output) it is more
efficient to perform the output directly, which I guess is the
motivation of using operator<<. A context that can take
parameters could make this possible, for example using
llvm::raw_ostream (a faster alternative to std::ostream):<br>
<br>
using namespace llvm;<br>
raw_ostream out;<br>
F"% Hello %i World: %{x =3D=3D 1 ? "a" : "b"}!=
"_raw_ostream{out};<br>
<br>
Using a wrapper around raw_ostream that uses operator() instead of
operator<< can directly insert into the stream with zero
overhead compared to a handwritten sequence of statements (same
applies for std::ostream). What is weird about this syntax, though,
is the placement of the "thing" that does the actual work at =
the end
of the expression instead of the front as it were in a function
call. Your approach with the receiving object at the front makes it
at least *look* better. Maybe these can somehow be combined.<br>
<br>
Regardless of whether my approach here works or not, I think a
solution that is not directly coupled to a certain operator (except
the call operator) is less restricted and far more flexible.
Function objects are way more common than insertion operators and
maybe we can slow down the spreading abuse of operator<< . I
know of some classes that could be an immediate drop-in and would
"just work" with minimal adjustments. If the standard-provide=
d
string context uses ADL-based lookup to (for example) to_string(x),
or to_string(context, x), you have a convenient customization point
to support the default string interpolation.<br>
<br>
(2) Even if you stick to operator<< I find it *very*
disturbing that there is no << between cout and the literal.<br>
<br>
cout F"% ..."; // Where's the operator? No call parens? A=
m I blind?
Is the sky falling?<br>
cout << F"% ..."; // Ah, there it is!<br>
<br>
It also means that with your approach I couldn't pass the result of
the interpolated literal as function parameter.<br>
<br>
foo(F"% ...") // ill-formed: foo(<< "...")<br=
>
<br>
(Which would be also ill-formed if the compiler can't find a
matching operator<<, but that's a different issue.)<br>
<br>
It has to be as convenient and flexible as possible for the
end-user.<br>
<br>
(3) I think it's very strange to have the escaping character be par=
t
of the string literal. To me it lacks a clear separation between the
actual literal content and the introducer. Look at raw literals:
R"delimiter(...)delimiter" where there is a clearly visible
distinction between "content" and "non-content". No=
t sure how to do
this properly, especially regarding the next point:<br>
<br>
(4) How does this combine with the other literal prefixes, like R?<br>
<br>
(5) There are actually two proposals in there: string interpolation
and multiline literals. Those are completely orthogonal and you
don't need the one to implement the other. You'd be better off
making these two separate (independent) proposals.<br>
<br>
<div>Am 18.09.2015 um 22:21 schrieb Andrew
Tomazos:<br>
</div>
<blockquote type=3D"cite">
<div dir=3D"ltr">Please find attached a very very rough draft of a
proposal entitled "Interpolated String Literals".
<div><br>
</div>
<div>Mainly after encouragement or discouragement, and any
high-level thoughts you might have about it.</div>
<div><br>
</div>
</div>
-- <br>
<br>
--- <br>
You received this message because you are subscribed to the Google
Groups "ISO C++ Standard - Future Proposals" group.<br>
To unsubscribe from this group and stop receiving emails from it,
send an email to <a href=3D"javascript:" target=3D"_blank" gdf-obfusc=
ated-mailto=3D"qDH0vk_tBAAJ" rel=3D"nofollow" onmousedown=3D"this.href=3D&#=
39;javascript:';return true;" onclick=3D"this.href=3D'javascript:&#=
39;;return true;">std-proposal...@<wbr>isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"javascript:" target=
=3D"_blank" gdf-obfuscated-mailto=3D"qDH0vk_tBAAJ" rel=3D"nofollow" onmouse=
down=3D"this.href=3D'javascript:';return true;" onclick=3D"this.hre=
f=3D'javascript:';return true;">std-pr...@isocpp.org</a>.<br>
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/=
group/std-proposals/" target=3D"_blank" rel=3D"nofollow" onmousedown=3D"thi=
s.href=3D'http://groups.google.com/a/isocpp.org/group/std-proposals/=
9;;return true;" onclick=3D"this.href=3D'http://groups.google.com/a/iso=
cpp.org/group/std-proposals/';return true;">http://groups.google.com/a/=
<wbr>isocpp.org/group/std-<wbr>proposals/</a>.<br>
</blockquote>
<br>
</div>
</blockquote></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_1876_1267557028.1442658797790--
------=_Part_1875_331683846.1442658797789--
.
Author: Miro Knejp <miro.knejp@gmail.com>
Date: Sat, 19 Sep 2015 17:23:18 +0200
Raw View
Am 19.09.2015 um 12:33 schrieb Bengt Gustafsson:
> I like the basic idea, but here are some comments:
>
> - Do we really need to be able to specify the introducer character.
> Can't % be fixed (with the usual %% escape possibility).
I wouldn't mind if it were fixed to "%". Inerestingly "$" seems to be
pretty standard in so many other languages. I wonder if that is a more
suitable candidate for indicating to the reader "this is not printf!"
>
> - Wouldn't it be more logical if this resulted in an expanded pack,
> i.e. a number of comma separated parts. The use would then be:
>
> std::string goods = "cars";
> int count = 43;
> format(std::cout, F"The number of %goods is %count");
>
> which calls a:
>
> template<typename... Ps> void format(ostream&, Ps&&...);
I wonder which is less work for the compiler (regarding compile times)
and, more importantly, the library writer: Having a function object with
overloaded operator() for all the types it can handle or writing a
variadic template that then has to delegate to actual functions doing
the work. The latter can of course use the former, but I wonder which is
more tedious to implement. Plus, if you want to do string building
efficiently you probably want to use some form of shared state between
formatting functions for scratch buffers and O(n) allocations instead of
O(n*n).
>
> Arbitrarily reusing << is a little bit to much of a hack for my taste.
> Expanding as a pack to be picked up by a variadic template seems more
> like modern C++. The upcoming ... << ... type pack expansions
> of C++17 would make the implementation of format a breeze.
>
> Even with a << expansion I would prefer not to introduce an prefix one
> at the left, it seems more logical to write it out explicitly.
>
> - Translation is an important issue.
>
> There are utilities which scan the source code to find typically
> _("string") literals which get translated. This does not seem to play
> well with
> this suggestion. Translation is probably the most important reason for
> placing the inserts after the string literal in printf and similar,
> and this makes inline systems like shifting out on cout
> much harder to translate, and this suggested system even worse, as the
> parts of the literal can't be "addressed" at runtime so there is no
> chance of replacing the string with a translation.
String interpolation and translation are two completely different
beasts. I see no point mixing them in this proposal as the sentence
structure (and language) is fixed at compile time, which is such a poor
solution I wouldn't even mention the words translation, localization or
i18n *anywhere* in the proposal so people don't get stupid ideas. If you
want to do actual localization you need a runtime system that can
shuffle the sentence structure.
>
> Translation is also a main driver behind prefering named inserts, as
> different languages tend to want to reorder inserted words to get a
> grammatically correct sentence.
>
> This said there are of course uses when translation is not an issue,
> but I'm a bit worried that making untranslatable strings so much
> easier to use than translatable strings will make American programmers
> (who are as lazy as all programmers and create many of the most used
> softwares) conveniently forget about the needs for translation.
>
> Of course it is still possible to make a preprocessor which actually
> mangles the source code inserting the foreign string, but we want to
> move away from those ideas towards being able to change language at
> runtime.
String interpolation doesn't make printf-style formatting obsolete. They
do have intersecting use cases, but there is also things you can do with
only one or the other.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
.
Author: "Vicente J. Botet Escriba" <vicente.botet@wanadoo.fr>
Date: Sat, 19 Sep 2015 22:43:37 +0200
Raw View
Le 18/09/15 22:21, Andrew Tomazos a =C3=A9crit :
> Please find attached a very very rough draft of a proposal entitled
> "Interpolated String Literals".
>
> Mainly after encouragement or discouragement, and any high-level thoughts
> you might have about it.
>
I like the idea. IIUC the interpolated string
F"$ This is $i and this is $s."
you are proposing is syntactic sugar for
<< "This is " << i << " and this is " << s << "."
The transformation has the advantage that the result is already parsed.
However, if we want to manage with internationalization I believe that=20
the whole interpolated string should be translated to something like
format(translate("This is {1} and this is {2}."), i, u);
Where translate takes care of the internationalization, it would lookup=20
for the translation "This is %1% and this is %2%." in its dictionary.
format is a variadic variant of Boost.Format, which could be more=20
efficient than the use of % as in ,
format(translate("This is {1} and this is {2}.")) % i % u;
This is the schema used by Boost.Locale. IMO any internationalization=20
solution must pay at run time for the look-up and the parsing.
Why not have both using two different prefixes for two different=20
translation schemes?
I"$ This is $i and this is $s."
I recognize that a internationalization solution is more complex than=20
what you proposes and need much more than that. Your proposal has enough=20
value by itself, and could be adapted later if one day we have an=20
internationalization proposal.
Vicente
P.S. As others, I don't think it is correct to have the fist << in the=20
translation, the translation should result in one expression.
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
.
Author: Bengt Gustafsson <bengt.gustafsson@beamways.com>
Date: Sun, 20 Sep 2015 02:29:12 -0700 (PDT)
Raw View
------=_Part_61_1238891008.1442741353047
Content-Type: multipart/alternative;
boundary="----=_Part_62_2136647832.1442741353047"
------=_Part_62_2136647832.1442741353047
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Vicente: I like your idea of transforming the string to a "classic" format=
=20
string + a list of parameters. This enables translation. However, I don't=
=20
think that a proposal which directly translates the
result to something containing specific function names like format and=20
translate has much chance with the committe. My synergetic suggestion would=
=20
then be this transformation:
int i;
string s;
F"This is $i and this is $s."
translates to:
"This is $1$ and this is $2$.", i, s
which must be complemented at the call site into something like:
translated_format(cout, F"This is $i and this is $s.");
Note that a drawback with this scheme, in conjunction with translation, is=
=20
that gettext or whatever tool is used to extract the strings from the=20
source code has to mimic the transformation of the literal that the=20
compiler does. This should be doable as long as it can be done in a context=
=20
free way, i.e. without having access to the symbol table. I'm unsure if the=
=20
problematic > parsing passes this test.
An alternative syntax for the original string solves this:
F"This is $i+3$ and this is $s$ ."
but this opens another can of worms, as now you have to be able to parse=20
this:
F"This is $i+3$ and this is $s + "extra"$ ."
without stumbling on the nested quotation marks...
I don't know if even this can be prevented:
F"This is $i+3$ and this is $s + F" extra $i*2$"$ ."
This is no problem for a recursive decent parser, but maybe it is overdoing=
=20
it. Any system allowing an expression inside the literal must however=20
define rules for nexting of string literals and F-literals inside those=20
expressions.
A side note: The nested literal F" extra $i*2$" in the example above=20
specifies a leading space before the word extra. I think this speaks=20
against the idea of defining the insert prefix at the start of the string.=
=20
It is not so easy to see the difference between one and two spaces, and=20
with tabs in the mix it gets worse...
Den l=C3=B6rdag 19 september 2015 kl. 22:43:40 UTC+2 skrev Vicente J. Botet=
=20
Escriba:
>
> Le 18/09/15 22:21, Andrew Tomazos a =C3=A9crit :=20
> > Please find attached a very very rough draft of a proposal entitled=20
> > "Interpolated String Literals".=20
> >=20
> > Mainly after encouragement or discouragement, and any high-level=20
> thoughts=20
> > you might have about it.=20
> >=20
> I like the idea. IIUC the interpolated string=20
>
> F"$ This is $i and this is $s."=20
>
> you are proposing is syntactic sugar for=20
>
> << "This is " << i << " and this is " << s << "."=20
>
> The transformation has the advantage that the result is already parsed.=
=20
>
> However, if we want to manage with internationalization I believe that=20
> the whole interpolated string should be translated to something like=20
>
> format(translate("This is {1} and this is {2}."), i, u);=20
>
> Where translate takes care of the internationalization, it would lookup=
=20
> for the translation "This is %1% and this is %2%." in its dictionary.=20
> format is a variadic variant of Boost.Format, which could be more=20
> efficient than the use of % as in ,=20
>
> format(translate("This is {1} and this is {2}.")) % i % u;=20
>
> This is the schema used by Boost.Locale. IMO any internationalization=20
> solution must pay at run time for the look-up and the parsing.=20
>
> Why not have both using two different prefixes for two different=20
> translation schemes?=20
>
> I"$ This is $i and this is $s."=20
>
> I recognize that a internationalization solution is more complex than=20
> what you proposes and need much more than that. Your proposal has enough=
=20
> value by itself, and could be adapted later if one day we have an=20
> internationalization proposal.=20
>
> Vicente=20
>
> P.S. As others, I don't think it is correct to have the fist << in the=
=20
> translation, the translation should result in one expression.=20
>
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
------=_Part_62_2136647832.1442741353047
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">Vicente: I like your idea of transforming the string to a =
"classic" format string + a list of parameters. This enables tran=
slation. However, I don't think that a proposal which directly translat=
es the<div>result to something containing specific function names like form=
at and translate has much chance with the committe. My synergetic suggestio=
n would then be this transformation:</div><div><br></div><div>int i;</div><=
div>string s;</div><div><br></div><div>=C2=A0F"This is $i and this is =
$s."</div><div><br></div><div>translates to:</div><div><br></div><div>=
"This is $1$ and this is $2$.", i, s</div><div><br></div><div>whi=
ch must be complemented at the call site into something like:</div><div><br=
></div><div>translated_format(cout,=C2=A0=C2=A0F"This is $i and this i=
s $s.");</div><div><br></div><div>Note that a drawback with this schem=
e, in conjunction with translation, is that gettext or whatever tool is use=
d to extract the strings from the source code has to mimic the transformati=
on of the literal that the compiler does. This should be doable as long as =
it can be done in a context free way, i.e. without having access to the sym=
bol table. I'm unsure if the problematic > parsing passes this test.=
</div><div><br></div><div>An alternative syntax for the original string sol=
ves this:</div><div><br></div><div>=C2=A0F"This is $i+3$ and this is $=
s$ ."<br></div><div><br></div><div>but this opens another can of worms=
, as now you have to be able to parse this:</div><div><br></div><div>=C2=A0=
F"This is $i+3$ and this is $s + "extra"$ ."<br></div><=
div><br></div><div>without stumbling on the nested quotation marks...</div>=
<div><br></div><div>I don't know if even this can be prevented:</div><d=
iv><br></div><div><div>=C2=A0F"This is $i+3$ and this is $s + F" =
extra $i*2$"$ ."<br></div></div><div><br></div><div>This is no pr=
oblem for a recursive decent parser, but maybe it is overdoing it. Any syst=
em allowing an expression inside the literal must however define rules for =
nexting of string literals and F-literals inside those expressions.</div><d=
iv><br></div><div>A side note: The nested literal =C2=A0F" extra $i*2$=
" in the example above specifies a leading space before the word extra=
.. I think this speaks against the idea of defining the insert prefix at the=
start of the string. It is not so easy to see the difference between one a=
nd two spaces, and with tabs in the mix it gets worse...</div><div><br></di=
v><div><br></div><div>Den l=C3=B6rdag 19 september 2015 kl. 22:43:40 UTC+2 =
skrev Vicente J. Botet Escriba:<blockquote class=3D"gmail_quote" style=3D"m=
argin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"=
>Le 18/09/15 22:21, Andrew Tomazos a =C3=A9crit :
<br>> Please find attached a very very rough draft of a proposal entitle=
d
<br>> "Interpolated String Literals".
<br>>
<br>> Mainly after encouragement or discouragement, and any high-level t=
houghts
<br>> you might have about it.
<br>>
<br>I like the idea. IIUC the interpolated string
<br>
<br>=C2=A0 =C2=A0 =C2=A0F"$ This is $i and this is $s."
<br>
<br>you are proposing is syntactic sugar for
<br>
<br>=C2=A0 =C2=A0 =C2=A0<< "This is " << i << &=
quot; and this is " << s << "."
<br>
<br>The transformation has the advantage that the result is already parsed.
<br>
<br>However, if we want to manage with internationalization I believe that=
=20
<br>the whole interpolated string should be translated to something like
<br>
<br>=C2=A0 =C2=A0 =C2=A0format(translate("This is {1} and this is {2}.=
"), i, u);
<br>
<br>Where translate takes care of the internationalization, it would lookup=
=20
<br>for the translation "This is %1% and this is %2%." in its dic=
tionary.
<br>format is a variadic variant of Boost.Format, which could be more=20
<br>efficient than the use of % as in ,
<br>
<br>=C2=A0 =C2=A0 =C2=A0format(translate("This is {1} and this is {2}.=
")) % i % u;
<br>
<br>This is the schema used by Boost.Locale. IMO any internationalization=
=20
<br>solution must pay at run time for the look-up and the parsing.
<br>
<br>Why not have both using two different prefixes for two different=20
<br>translation schemes?
<br>
<br>=C2=A0 =C2=A0 =C2=A0I"$ This is $i and this is $s."
<br>
<br>I recognize that a internationalization solution is more complex than=
=20
<br>what you proposes and need much more than that. Your proposal has enoug=
h=20
<br>value by itself, and could be adapted later if one day we have an=20
<br>internationalization proposal.
<br>
<br>Vicente
<br>
<br>P.S. As others, I don't think it is correct =C2=A0to have the fist =
<< in the=20
<br>translation, the translation should result in one expression.
<br></blockquote></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_62_2136647832.1442741353047--
------=_Part_61_1238891008.1442741353047--
.
Author: Miro Knejp <miro.knejp@gmail.com>
Date: Sun, 20 Sep 2015 12:14:47 +0200
Raw View
This is a multi-part message in MIME format.
--------------060101050508030604030904
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: quoted-printable
More reasons not to darg translation into this topic.
There are use cases for string interpolation and there are use cases for=20
runtime formatting. If you want a runtime-provided translation you=20
probably also worry about runtime-provided formatting options, like=20
left/right alignment based on writing direction, plurality forms,=20
gender-based declination, date-time specifiers and whatnot. Stuff like=20
"blah blah {0:select(his, her, condition)} blah blah". These options=20
have to be written by translators who don't ever see the source code, so=20
it is far more than just changing the sequence of a sentence. How is the=20
compiler supposed to create these?
Furthermore a tool that extracts strings from source code is IMHO bad=20
practice. It makes *programmers* write user-visible strings in source=20
code, which is just plain bad and should be done by=20
*translators/designers*, even if it is their native language, and not in=20
the source code. Imagine you have dedicated people (non-coders, possibly=20
external) who provide the English texts and make sure they are=20
consistent and error-free and conform to all kinds of marketing=20
nonsense. This is not a burden for programmers and something that should=20
not be done at source-code level. If you want to encourage good=20
practice, don't encourage people to write *any* localizable or evn=20
user-visible strings in source code (I could turn a blind eye on log=20
files and internal exceptions). User-visible strings should be treated=20
equally as data to your application just as images or sounds.
Please, if you want formatting, create a formatting proposal. If you=20
want translation, create a translation proposal. Both are needed. But=20
there's no point in trying to shoehorn everything into string=20
interpolation, which is simply a tool to break up a string into a=20
sequence of expressions.
Am 20.09.2015 um 11:29 schrieb Bengt Gustafsson:
> Vicente: I like your idea of transforming the string to a "classic"=20
> format string + a list of parameters. This enables translation.=20
> However, I don't think that a proposal which directly translates the
> result to something containing specific function names like format and=20
> translate has much chance with the committe. My synergetic suggestion=20
> would then be this transformation:
>
> int i;
> string s;
>
> F"This is $i and this is $s."
>
> translates to:
>
> "This is $1$ and this is $2$.", i, s
>
> which must be complemented at the call site into something like:
>
> translated_format(cout, F"This is $i and this is $s.");
>
> Note that a drawback with this scheme, in conjunction with=20
> translation, is that gettext or whatever tool is used to extract the=20
> strings from the source code has to mimic the transformation of the=20
> literal that the compiler does. This should be doable as long as it=20
> can be done in a context free way, i.e. without having access to the=20
> symbol table. I'm unsure if the problematic > parsing passes this test.
>
> An alternative syntax for the original string solves this:
>
> F"This is $i+3$ and this is $s$ ."
>
> but this opens another can of worms, as now you have to be able to=20
> parse this:
>
> F"This is $i+3$ and this is $s + "extra"$ ."
>
> without stumbling on the nested quotation marks...
>
> I don't know if even this can be prevented:
>
> F"This is $i+3$ and this is $s + F" extra $i*2$"$ ."
>
> This is no problem for a recursive decent parser, but maybe it is=20
> overdoing it. Any system allowing an expression inside the literal=20
> must however define rules for nexting of string literals and=20
> F-literals inside those expressions.
>
> A side note: The nested literal F" extra $i*2$" in the example above=20
> specifies a leading space before the word extra. I think this speaks=20
> against the idea of defining the insert prefix at the start of the=20
> string. It is not so easy to see the difference between one and two=20
> spaces, and with tabs in the mix it gets worse...
>
>
> Den l=C3=B6rdag 19 september 2015 kl. 22:43:40 UTC+2 skrev Vicente J. Bot=
et=20
> Escriba:
>
> Le 18/09/15 22:21, Andrew Tomazos a =C3=A9crit :
> > Please find attached a very very rough draft of a proposal entitled
> > "Interpolated String Literals".
> >
> > Mainly after encouragement or discouragement, and any high-level
> thoughts
> > you might have about it.
> >
> I like the idea. IIUC the interpolated string
>
> F"$ This is $i and this is $s."
>
> you are proposing is syntactic sugar for
>
> << "This is " << i << " and this is " << s << "."
>
> The transformation has the advantage that the result is already
> parsed.
>
> However, if we want to manage with internationalization I believe
> that
> the whole interpolated string should be translated to something like
>
> format(translate("This is {1} and this is {2}."), i, u);
>
> Where translate takes care of the internationalization, it would
> lookup
> for the translation "This is %1% and this is %2%." in its dictionary.
> format is a variadic variant of Boost.Format, which could be more
> efficient than the use of % as in ,
>
> format(translate("This is {1} and this is {2}.")) % i % u;
>
> This is the schema used by Boost.Locale. IMO any internationalization
> solution must pay at run time for the look-up and the parsing.
>
> Why not have both using two different prefixes for two different
> translation schemes?
>
> I"$ This is $i and this is $s."
>
> I recognize that a internationalization solution is more complex than
> what you proposes and need much more than that. Your proposal has
> enough
> value by itself, and could be adapted later if one day we have an
> internationalization proposal.
>
> Vicente
>
> P.S. As others, I don't think it is correct to have the fist <<
> in the
> translation, the translation should result in one expression.
>
> --=20
>
> ---
> You received this message because you are subscribed to the Google=20
> Groups "ISO C++ Standard - Future Proposals" group.
> To unsubscribe from this group and stop receiving emails from it, send=20
> an email to std-proposals+unsubscribe@isocpp.org=20
> <mailto:std-proposals+unsubscribe@isocpp.org>.
> To post to this group, send email to std-proposals@isocpp.org=20
> <mailto:std-proposals@isocpp.org>.
> Visit this group at=20
> http://groups.google.com/a/isocpp.org/group/std-proposals/.
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
--------------060101050508030604030904
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<html>
<head>
<meta content=3D"text/html; charset=3Dutf-8" http-equiv=3D"Content-Type=
">
</head>
<body bgcolor=3D"#FFFFFF" text=3D"#000000">
More reasons not to darg translation into this topic.<br>
There are use cases for string interpolation and there are use cases
for runtime formatting. If you want a runtime-provided translation
you probably also worry about runtime-provided formatting options,
like left/right alignment based on writing direction, plurality
forms, gender-based declination, date-time specifiers and whatnot.
Stuff like "blah blah {0:select(his, her, condition)} blah blah".
These options have to be written by translators who don't ever see
the source code, so it is far more than just changing the sequence
of a sentence. How is the compiler supposed to create these?<br>
<br>
Furthermore a tool that extracts strings from source code is IMHO
bad practice. It makes *programmers* write user-visible strings in
source code, which is just plain bad and should be done by
*translators/designers*, even if it is their native language, and
not in the source code. Imagine you have dedicated people
(non-coders, possibly external) who provide the English texts and
make sure they are consistent and error-free and conform to all
kinds of marketing nonsense. This is not a burden for programmers
and something that should not be done at source-code level. If you
want to encourage good practice, don't encourage people to write
*any* localizable or evn user-visible strings in source code (I
could turn a blind eye on log files and internal exceptions).
User-visible strings should be treated equally as data to your
application just as images or sounds.<br>
<br>
Please, if you want formatting, create a formatting proposal. If you
want translation, create a translation proposal. Both are needed.
But there's no point in trying to shoehorn everything into string
interpolation, which is simply a tool to break up a string into a
sequence of expressions.<br>
<br>
<div class=3D"moz-cite-prefix">Am 20.09.2015 um 11:29 schrieb Bengt
Gustafsson:<br>
</div>
<blockquote
cite=3D"mid:34e8c580-c03c-47d9-ace1-39dd5b1bb41a@isocpp.org"
type=3D"cite">
<div dir=3D"ltr">Vicente: I like your idea of transforming the
string to a "classic" format string + a list of parameters. This
enables translation. However, I don't think that a proposal
which directly translates the
<div>result to something containing specific function names like
format and translate has much chance with the committe. My
synergetic suggestion would then be this transformation:</div>
<div><br>
</div>
<div>int i;</div>
<div>string s;</div>
<div><br>
</div>
<div>=C2=A0F"This is $i and this is $s."</div>
<div><br>
</div>
<div>translates to:</div>
<div><br>
</div>
<div>"This is $1$ and this is $2$.", i, s</div>
<div><br>
</div>
<div>which must be complemented at the call site into something
like:</div>
<div><br>
</div>
<div>translated_format(cout,=C2=A0=C2=A0F"This is $i and this is $s=
..");</div>
<div><br>
</div>
<div>Note that a drawback with this scheme, in conjunction with
translation, is that gettext or whatever tool is used to
extract the strings from the source code has to mimic the
transformation of the literal that the compiler does. This
should be doable as long as it can be done in a context free
way, i.e. without having access to the symbol table. I'm
unsure if the problematic > parsing passes this test.</div>
<div><br>
</div>
<div>An alternative syntax for the original string solves this:</di=
v>
<div><br>
</div>
<div>=C2=A0F"This is $i+3$ and this is $s$ ."<br>
</div>
<div><br>
</div>
<div>but this opens another can of worms, as now you have to be
able to parse this:</div>
<div><br>
</div>
<div>=C2=A0F"This is $i+3$ and this is $s + "extra"$ ."<br>
</div>
<div><br>
</div>
<div>without stumbling on the nested quotation marks...</div>
<div><br>
</div>
<div>I don't know if even this can be prevented:</div>
<div><br>
</div>
<div>
<div>=C2=A0F"This is $i+3$ and this is $s + F" extra $i*2$"$ ."<b=
r>
</div>
</div>
<div><br>
</div>
<div>This is no problem for a recursive decent parser, but maybe
it is overdoing it. Any system allowing an expression inside
the literal must however define rules for nexting of string
literals and F-literals inside those expressions.</div>
<div><br>
</div>
<div>A side note: The nested literal =C2=A0F" extra $i*2$" in the
example above specifies a leading space before the word extra.
I think this speaks against the idea of defining the insert
prefix at the start of the string. It is not so easy to see
the difference between one and two spaces, and with tabs in
the mix it gets worse...</div>
<div><br>
</div>
<div><br>
</div>
<div>Den l=C3=B6rdag 19 september 2015 kl. 22:43:40 UTC+2 skrev
Vicente J. Botet Escriba:
<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left:
0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">Le
18/09/15 22:21, Andrew Tomazos a =C3=A9crit :
<br>
> Please find attached a very very rough draft of a
proposal entitled
<br>
> "Interpolated String Literals".
<br>
>
<br>
> Mainly after encouragement or discouragement, and any
high-level thoughts
<br>
> you might have about it.
<br>
>
<br>
I like the idea. IIUC the interpolated string
<br>
<br>
=C2=A0 =C2=A0 =C2=A0F"$ This is $i and this is $s."
<br>
<br>
you are proposing is syntactic sugar for
<br>
<br>
=C2=A0 =C2=A0 =C2=A0<< "This is " << i << " a=
nd this is "
<< s << "."
<br>
<br>
The transformation has the advantage that the result is
already parsed.
<br>
<br>
However, if we want to manage with internationalization I
believe that <br>
the whole interpolated string should be translated to
something like
<br>
<br>
=C2=A0 =C2=A0 =C2=A0format(translate("This is {1} and this is {=
2}."), i,
u);
<br>
<br>
Where translate takes care of the internationalization, it
would lookup <br>
for the translation "This is %1% and this is %2%." in its
dictionary.
<br>
format is a variadic variant of Boost.Format, which could be
more <br>
efficient than the use of % as in ,
<br>
<br>
=C2=A0 =C2=A0 =C2=A0format(translate("This is {1} and this is {=
2}.")) % i %
u;
<br>
<br>
This is the schema used by Boost.Locale. IMO any
internationalization <br>
solution must pay at run time for the look-up and the
parsing.
<br>
<br>
Why not have both using two different prefixes for two
different <br>
translation schemes?
<br>
<br>
=C2=A0 =C2=A0 =C2=A0I"$ This is $i and this is $s."
<br>
<br>
I recognize that a internationalization solution is more
complex than <br>
what you proposes and need much more than that. Your
proposal has enough <br>
value by itself, and could be adapted later if one day we
have an <br>
internationalization proposal.
<br>
<br>
Vicente
<br>
<br>
P.S. As others, I don't think it is correct =C2=A0to have the
fist << in the <br>
translation, the translation should result in one
expression.
<br>
</blockquote>
</div>
</div>
-- <br>
<br>
--- <br>
You received this message because you are subscribed to the Google
Groups "ISO C++ Standard - Future Proposals" group.<br>
To unsubscribe from this group and stop receiving emails from it,
send an email to <a moz-do-not-send=3D"true"
href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposals+=
unsubscribe@isocpp.org</a>.<br>
To post to this group, send email to <a moz-do-not-send=3D"true"
href=3D"mailto:std-proposals@isocpp.org">std-proposals@isocpp.org</=
a>.<br>
Visit this group at <a moz-do-not-send=3D"true"
href=3D"http://groups.google.com/a/isocpp.org/group/std-proposals/"=
>http://groups.google.com/a/isocpp.org/group/std-proposals/</a>.<br>
</blockquote>
<br>
</body>
</html>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--------------060101050508030604030904--
.
Author: Andrew Tomazos <andrewtomazos@gmail.com>
Date: Sun, 20 Sep 2015 15:01:26 +0200
Raw View
--089e0103009cd7c95505202d5c1d
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
On Sat, Sep 19, 2015 at 12:33 PM, Bengt Gustafsson <
bengt.gustafsson@beamways.com> wrote:
> - Do we really need to be able to specify the introducer character. Can't
> % be fixed (with the usual %% escape possibility).
>
I considered that, but no matter what introducer you pick, there are always
cases where the introducer is prevalent in the target string. This occurs
in natural language, but is especially the case of code generation, where
you are generating strings for later compilation in C++ or some other
programming language. Having the introducer be defined at the start also
makes it easier to read, as you are reminded what the special token is
(just like the compiler is).
Compare:
F"The result of %x %% %y is not zero (it is %(x%y))."
with
F"$ The result of $x % $y is not zero (it is $[x%y])."
Similar problematic examples can be found with any set predefined
introducer or set predefined brackets.
- Wouldn't it be more logical if this resulted in an expanded pack, i.e. a
> number of comma separated parts.
>
format(std::cout, F"The number of %goods is %count");
>
No, I think:
std::cout F"% The number of %goods is %count";
is better.
But I am considering changing the definition of an interpolated string to
be a function call expression of return type std::interpolated_string.
This would mean we would have to write:
std::cout << F"% The number of %goods is %count";
(which some have requested anyway).
But it also means we could also write:
std::string s =3D F"% The number of %goods is %count";
or use it anywhere you can use a string normally.
std::interpolated_string would contain:
1. a reference to the constant expression format string and positions of
embedded expressions (which are known at compile time)
2. references to the values of the evaluated embedded expressions for the
current execution. (calculated at run-time usually, but it should be
constexpr-compatible)
This means the operator<<(ostream&, interpolated_string) could be defined
to stream out the substrings and subexpressions just like (and just as
efficiently) as if you had written << for each.
For the conversion from std::interpolated_string to std::string, it could
use std::ostringstream internally or some more efficient method.
So consumers of std::interpolated_strings could use operator<<(ostream&,
std::interpolated_string), or use the conversion from
std::interpolated_string to std::string implicitly (by just using
std::string or std::string_view), or they could overload on
std::interpolated_string.
Users could also overload on std::interpolated_string to implement a
translation mechanism, as they would have access to both the original
source code text of the expressions as well as their evaluated values.
std::interpolated_string would actually be a class template parametric on
the types of the embedded expressions, but that's an implementation detail.
> which calls a:
>
> template<typename... Ps> void format(ostream&, Ps&&...);
>
> Arbitrarily reusing << is a little bit to much of a hack for my taste.
> Expanding as a pack to be picked up by a variadic template seems more lik=
e
> modern C++. The upcoming ... << ... type pack expansions
> of C++17 would make the implementation of format a breeze.
>
> Even with a << expansion I would prefer not to introduce an prefix one at
> the left, it seems more logical to write it out explicitly.
>
> - Translation is an important issue.
>
> There are utilities which scan the source code to find typically
> _("string") literals which get translated. This does not seem to play wel=
l
> with
> this suggestion. Translation is probably the most important reason for
> placing the inserts after the string literal in printf and similar, and
> this makes inline systems like shifting out on cout
> much harder to translate, and this suggested system even worse, as the
> parts of the literal can't be "addressed" at runtime so there is no chanc=
e
> of replacing the string with a translation.
>
> Translation is also a main driver behind prefering named inserts, as
> different languages tend to want to reorder inserted words to get a
> grammatically correct sentence.
>
> This said there are of course uses when translation is not an issue, but
> I'm a bit worried that making untranslatable strings so much easier to us=
e
> than translatable strings will make American programmers (who are as lazy
> as all programmers and create many of the most used softwares) convenient=
ly
> forget about the needs for translation.
>
> Of course it is still possible to make a preprocessor which actually
> mangles the source code inserting the foreign string, but we want to move
> away from those ideas towards being able to change language at runtime.
>
>
> Den l=C3=B6rdag 19 september 2015 kl. 00:04:23 UTC+2 skrev Miro Knejp:
>
>> Nice, I wanted this so many times already.
>>
>> But there are a few points I find a bit strange.
>>
>> (1) I don't think operator<< is the right choice. With your proposal it
>> means I cannot do the very basic thing that works in every language with
>> string interpolation:
>> std::string s =3D F"% Hello %i World!";
>> auto s =3D F"% Hello %i World!"; // What is auto?
>> Any proposal that cannot get the above two lines to "just work" with
>> standard types is simply not good enough in my oppinion.
>>
>> I believe to make this work properly one needs some other infrastructure
>> to exist first. There has to be a way to pass the expression to be
>> formatted to some function that knows how to format it? Last time I used
>> string interpolation was in Scala, where the literal prefix is actually =
the
>> name of a function to call with the transformed string. I don't know
>> whether we can ever introduce user defined string prefixes, but who know=
s.
>> However, I think for now, a more flexible way is to combine both prefix =
and
>> suffix. Let me try to explain with an example using your syntax where
>> applicable:
>>
>> auto s =3D F"% Hello %i World: %{x =3D=3D 1 ? "a" : "b"}!"_my_string;
>>
>> This is translated to something like:
>> auto&& __context =3D operator""_my_string();
>> __context("Hello ");
>> __context(i);
>> __context(" World: ");
>> __context(x =3D=3D 1 ? "a" : "b"); // Note the correct handling of liter=
als
>> inside %{ }
>> __context("!");
>> auto s =3D move(__context).get();d
>>
>> Whatever x this UDL returns must make the expression x(expr) well-formed
>> for every expr that is an embedded expression of the string literal, or =
an
>> actual string literal. Unfortunately this requires that a string literal
>> with *only* the introducing prefix is ill-formed, unless we make the
>> exception that a lacking suffix uses a standard-library context that
>> produces a std::string (whether this is a good idea is debatable, but it
>> sure as hell would be friggin' convenient). Assuming no exceptions the
>> get() method is invoked exactly once and therefore can use this knowledg=
e
>> to move the result out of the object. The move() helps to prefer an
>> rvalue-qualified overload if one exists.
>>
>> The UDL is declared as usual but takes no parameters:
>>
>> MyStringBuilder operator""_my_string();
>>
>> This suggests that the context cannot take constructor parameter, which
>> may be a severe limitation. If constructor arguments are desirable then =
it
>> would certainly need a syntax that distinguishes this UDL from others (o=
r
>> find a solution other than UDLs). An interpolated string that is used fo=
r a
>> purpose other than being stored in some location (like performing output=
)
>> it is more efficient to perform the output directly, which I guess is th=
e
>> motivation of using operator<<. A context that can take parameters could
>> make this possible, for example using llvm::raw_ostream (a faster
>> alternative to std::ostream):
>>
>> using namespace llvm;
>> raw_ostream out;
>> F"% Hello %i World: %{x =3D=3D 1 ? "a" : "b"}!"_raw_ostream{out};
>>
>> Using a wrapper around raw_ostream that uses operator() instead of
>> operator<< can directly insert into the stream with zero overhead compar=
ed
>> to a handwritten sequence of statements (same applies for std::ostream).
>> What is weird about this syntax, though, is the placement of the "thing"
>> that does the actual work at the end of the expression instead of the fr=
ont
>> as it were in a function call. Your approach with the receiving object a=
t
>> the front makes it at least *look* better. Maybe these can somehow be
>> combined.
>>
>> Regardless of whether my approach here works or not, I think a solution
>> that is not directly coupled to a certain operator (except the call
>> operator) is less restricted and far more flexible. Function objects are
>> way more common than insertion operators and maybe we can slow down the
>> spreading abuse of operator<< . I know of some classes that could be an
>> immediate drop-in and would "just work" with minimal adjustments. If the
>> standard-provided string context uses ADL-based lookup to (for example)
>> to_string(x), or to_string(context, x), you have a convenient customizat=
ion
>> point to support the default string interpolation.
>>
>> (2) Even if you stick to operator<< I find it *very* disturbing that
>> there is no << between cout and the literal.
>>
>> cout F"% ..."; // Where's the operator? No call parens? Am I blind? Is
>> the sky falling?
>> cout << F"% ..."; // Ah, there it is!
>>
>> It also means that with your approach I couldn't pass the result of the
>> interpolated literal as function parameter.
>>
>> foo(F"% ...") // ill-formed: foo(<< "...")
>>
>> (Which would be also ill-formed if the compiler can't find a matching
>> operator<<, but that's a different issue.)
>>
>> It has to be as convenient and flexible as possible for the end-user.
>>
>> (3) I think it's very strange to have the escaping character be part of
>> the string literal. To me it lacks a clear separation between the actual
>> literal content and the introducer. Look at raw literals:
>> R"delimiter(...)delimiter" where there is a clearly visible distinction
>> between "content" and "non-content". Not sure how to do this properly,
>> especially regarding the next point:
>>
>> (4) How does this combine with the other literal prefixes, like R?
>>
>> (5) There are actually two proposals in there: string interpolation and
>> multiline literals. Those are completely orthogonal and you don't need t=
he
>> one to implement the other. You'd be better off making these two separat=
e
>> (independent) proposals.
>>
>> Am 18.09.2015 um 22:21 schrieb Andrew Tomazos:
>>
>> Please find attached a very very rough draft of a proposal entitled
>> "Interpolated String Literals".
>>
>> Mainly after encouragement or discouragement, and any high-level thought=
s
>> you might have about it.
>>
>> --
>>
>> ---
>> You received this message because you are subscribed to the Google Group=
s
>> "ISO C++ Standard - Future Proposals" group.
>> To unsubscribe from this group and stop receiving emails from it, send a=
n
>> email to std-proposal...@isocpp.org.
>> To post to this group, send email to std-pr...@isocpp.org.
>> Visit this group at
>> http://groups.google.com/a/isocpp.org/group/std-proposals/.
>>
>>
>> --
>
> ---
> You received this message because you are subscribed to the Google Groups
> "ISO C++ Standard - Future Proposals" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to std-proposals+unsubscribe@isocpp.org.
> To post to this group, send email to std-proposals@isocpp.org.
> Visit this group at
> http://groups.google.com/a/isocpp.org/group/std-proposals/.
>
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
--089e0103009cd7c95505202d5c1d
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div class=3D"gmail_extra"><div class=3D"gmail_quote">On S=
at, Sep 19, 2015 at 12:33 PM, Bengt Gustafsson <span dir=3D"ltr"><<a hre=
f=3D"mailto:bengt.gustafsson@beamways.com" target=3D"_blank">bengt.gustafss=
on@beamways.com</a>></span> wrote:<br><blockquote class=3D"gmail_quote" =
style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:r=
gb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir=3D"ltr">=
<div>- Do we really need to be able to specify the introducer character. Ca=
n't % be fixed (with the usual %% escape possibility).</div></div></blo=
ckquote><div><br></div><div>I considered that, but no matter what introduce=
r you pick, there are always cases where the introducer is prevalent in the=
target string.=C2=A0 This occurs in natural language, but is especially th=
e case of code generation, where you are generating strings for later compi=
lation in C++ or some other programming language.=C2=A0 Having the introduc=
er be defined at the start also makes it easier to read, as you are reminde=
d what the special token is (just like the compiler is).</div><div><br></di=
v><div>Compare:</div><div><br></div><div>=C2=A0 =C2=A0F"The result of =
%x %% %y is not zero (it is %(x%y))."</div><div><br></div><div>with</d=
iv><div><br></div><div>=C2=A0 =C2=A0F"$ The result of $x % $y is not z=
ero (it is $[x%y])."</div><div><br></div><div>Similar problematic exam=
ples can be found with any set predefined introducer or set predefined brac=
kets.</div><div><br></div><blockquote class=3D"gmail_quote" style=3D"margin=
:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204)=
;border-left-style:solid;padding-left:1ex"><div dir=3D"ltr"><div></div><div=
>- Wouldn't it be more logical if this resulted in an expanded pack, i.=
e. a number of comma separated parts.</div></div></blockquote><div><br></di=
v><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;borde=
r-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid=
;padding-left:1ex"><div dir=3D"ltr"><div>format(std::cout, F"The numbe=
r of %goods is %count");</div></div></blockquote><div><br></div><div>N=
o, I think:</div><div><br></div><div>=C2=A0 std::cout F"% The number o=
f %goods is %count";</div><div><br></div><div>is better.</div><div><br=
></div><div>But I am considering changing the definition of an interpolated=
string to be a function call expression of return type std::interpolated_s=
tring.<br></div><div><br></div><div>This would mean we would have to write:=
</div><div><br></div><div><div>=C2=A0 std::cout << F"% The numbe=
r of %goods is %count";</div></div><div><br></div><div>(which some hav=
e requested anyway).</div><div><br></div><div>But it also means we could al=
so write:</div><div><br></div><div>=C2=A0 std::string s =3D F"% The nu=
mber of %goods is %count";</div><div><br></div><div>or use it anywhere=
you can use a string normally.</div><div><br></div><div>std::interpolated_=
string would contain:<br></div><div>1. a reference to the constant expressi=
on format string and positions of embedded expressions (which are known at =
compile time)</div><div>2. references to the values of the evaluated embedd=
ed expressions for the current execution. (calculated at run-time usually, =
but it should be constexpr-compatible)</div><div><br></div><div>This means =
the operator<<(ostream&, interpolated_string) could be defined to=
stream out the substrings and subexpressions just like (and just as effici=
ently) as if you had written << for each.</div><div><br></div><div>Fo=
r the conversion from std::interpolated_string to std::string, it could use=
std::ostringstream internally or some more efficient method.</div><div><br=
></div><div>So consumers of std::interpolated_strings could use operator<=
;<(ostream&, std::interpolated_string), or use the conversion from s=
td::interpolated_string to std::string implicitly (by just using std::strin=
g or std::string_view), or they could overload on std::interpolated_string.=
</div><div><br></div><div>Users could also overload on std::interpolated_st=
ring to implement a translation mechanism, as they would have access to bot=
h the original source code text of the expressions as well as their evaluat=
ed values.</div><div><br></div><div>std::interpolated_string would actually=
be a class template parametric on the types of the embedded expressions, b=
ut that's an implementation detail.</div><div><br></div><blockquote cla=
ss=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;=
border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex=
"><div dir=3D"ltr"><div><br></div><div>which calls a:</div><div><br></div><=
div>template<typename... Ps> void format(ostream&, Ps&&..=
..);</div><div><br></div><div>Arbitrarily reusing << is a little bit t=
o much of a hack for my taste. Expanding as a pack to be picked up by a var=
iadic template seems more like modern C++. The upcoming ... << ... ty=
pe pack expansions</div><div>of C++17 would make the implementation of form=
at a breeze.</div><div><br></div><div>Even with a << expansion I woul=
d prefer not to introduce an prefix one at the left, it seems more logical =
to write it out explicitly.</div><div><br></div><div>- Translation is an im=
portant issue.</div><div><br></div><div>There are utilities which scan the =
source code to find typically _("string") literals which get tran=
slated. This does not seem to play well with</div><div>this suggestion. Tra=
nslation is probably the most important reason for placing the inserts afte=
r the string literal in printf and similar, and this makes inline systems l=
ike shifting out on cout</div><div>much harder to translate, and this sugge=
sted system even worse, as the parts of the literal can't be "addr=
essed" at runtime so there is no chance of replacing the string with a=
translation.</div><div><br></div><div>Translation is also a main driver be=
hind prefering named inserts, as different languages tend to want to reorde=
r inserted words to get a grammatically correct sentence.</div><div><br></d=
iv><div>This said there are of course uses when translation is not an issue=
, but I'm a bit worried that making untranslatable strings so much easi=
er to use than translatable strings will make American programmers (who are=
as lazy as all programmers and create many of the most used softwares) con=
veniently forget about the needs for translation.</div><div><br></div><div>=
Of course it is still possible to make a preprocessor which actually mangle=
s the source code inserting the foreign string, but we want to move away fr=
om those ideas towards being able to change language at runtime.</div><div>=
<div><div class=3D"h5"><br><br>Den l=C3=B6rdag 19 september 2015 kl. 00:04:=
23 UTC+2 skrev Miro Knejp:</div></div><blockquote class=3D"gmail_quote" sty=
le=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(=
204,204,204);border-left-style:solid;padding-left:1ex">
=20
=20
=20
<div bgcolor=3D"#FFFFFF" text=3D"#000000"><div><div class=3D"h5">
Nice, I wanted this so many times already.<br>
<br>
But there are a few points I find a bit strange.<br>
<br>
(1) I don't think operator<< is the right choice. With your
proposal it means I cannot do the very basic thing that works in
every language with string interpolation:<br>
std::string s =3D F"% Hello %i World!";<br>
auto s =3D F"% Hello %i World!"; // What is auto?<br>
Any proposal that cannot get the above two lines to "just work&quo=
t; with
standard types is simply not good enough in my oppinion.<br>
<br>
I believe to make this work properly one needs some other
infrastructure to exist first. There has to be a way to pass the
expression to be formatted to some function that knows how to format
it? Last time I used string interpolation was in Scala, where the
literal prefix is actually the name of a function to call with the
transformed string. I don't know whether we can ever introduce user
defined string prefixes, but who knows. However, I think for now, a
more flexible way is to combine both prefix and suffix. Let me try
to explain with an example using your syntax where applicable:<br>
<br>
auto s =3D F"% Hello %i World: %{x =3D=3D 1 ? "a" : &quo=
t;b"}!"_my_string;<br>
<br>
This is translated to something like:<br>
auto&& __context =3D operator""_my_string();<br>
__context("Hello ");<br>
__context(i);<br>
__context(" World: ");<br>
__context(x =3D=3D 1 ? "a" : "b"); // Note the corr=
ect handling of
literals inside %{ }<br>
__context("!");<br>
auto s =3D move(__context).get();d<br>
<br>
Whatever x this UDL returns must make the expression x(expr)
well-formed for every expr that is an embedded expression of the
string literal, or an actual string literal. Unfortunately this
requires that a string literal with *only* the introducing prefix is
ill-formed, unless we make the exception that a lacking suffix uses
a standard-library context that produces a std::string (whether this
is a good idea is debatable, but it sure as hell would be friggin'
convenient). Assuming no exceptions the get() method is invoked
exactly once and therefore can use this knowledge to move the result
out of the object. The move() helps to prefer an rvalue-qualified
overload if one exists.<br>
<br>
The UDL is declared as usual but takes no parameters:<br>
<br>
MyStringBuilder operator""_my_string();<br>
<br>
This suggests that the context cannot take constructor parameter,
which may be a severe limitation. If constructor arguments are
desirable then it would certainly need a syntax that distinguishes
this UDL from others (or find a solution other than UDLs). An
interpolated string that is used for a purpose other than being
stored in some location (like performing output) it is more
efficient to perform the output directly, which I guess is the
motivation of using operator<<. A context that can take
parameters could make this possible, for example using
llvm::raw_ostream (a faster alternative to std::ostream):<br>
<br>
using namespace llvm;<br>
raw_ostream out;<br>
F"% Hello %i World: %{x =3D=3D 1 ? "a" : "b"}!=
"_raw_ostream{out};<br>
<br>
Using a wrapper around raw_ostream that uses operator() instead of
operator<< can directly insert into the stream with zero
overhead compared to a handwritten sequence of statements (same
applies for std::ostream). What is weird about this syntax, though,
is the placement of the "thing" that does the actual work at =
the end
of the expression instead of the front as it were in a function
call. Your approach with the receiving object at the front makes it
at least *look* better. Maybe these can somehow be combined.<br>
<br>
Regardless of whether my approach here works or not, I think a
solution that is not directly coupled to a certain operator (except
the call operator) is less restricted and far more flexible.
Function objects are way more common than insertion operators and
maybe we can slow down the spreading abuse of operator<< . I
know of some classes that could be an immediate drop-in and would
"just work" with minimal adjustments. If the standard-provide=
d
string context uses ADL-based lookup to (for example) to_string(x),
or to_string(context, x), you have a convenient customization point
to support the default string interpolation.<br>
<br>
(2) Even if you stick to operator<< I find it *very*
disturbing that there is no << between cout and the literal.<br>
<br>
cout F"% ..."; // Where's the operator? No call parens? A=
m I blind?
Is the sky falling?<br>
cout << F"% ..."; // Ah, there it is!<br>
<br>
It also means that with your approach I couldn't pass the result of
the interpolated literal as function parameter.<br>
<br>
foo(F"% ...") // ill-formed: foo(<< "...")<br=
>
<br>
(Which would be also ill-formed if the compiler can't find a
matching operator<<, but that's a different issue.)<br>
<br>
It has to be as convenient and flexible as possible for the
end-user.<br>
<br>
(3) I think it's very strange to have the escaping character be par=
t
of the string literal. To me it lacks a clear separation between the
actual literal content and the introducer. Look at raw literals:
R"delimiter(...)delimiter" where there is a clearly visible
distinction between "content" and "non-content". No=
t sure how to do
this properly, especially regarding the next point:<br>
<br>
(4) How does this combine with the other literal prefixes, like R?<br>
<br>
(5) There are actually two proposals in there: string interpolation
and multiline literals. Those are completely orthogonal and you
don't need the one to implement the other. You'd be better off
making these two separate (independent) proposals.<br>
<br>
<div>Am 18.09.2015 um 22:21 schrieb Andrew
Tomazos:<br>
</div>
</div></div><blockquote type=3D"cite"><div><div class=3D"h5">
<div dir=3D"ltr">Please find attached a very very rough draft of a
proposal entitled "Interpolated String Literals".
<div><br>
</div>
<div>Mainly after encouragement or discouragement, and any
high-level thoughts you might have about it.</div>
<div><br>
</div>
</div>
-- <br>
<br>
--- <br>
You received this message because you are subscribed to the Google
Groups "ISO C++ Standard - Future Proposals" group.<br></di=
v></div>
To unsubscribe from this group and stop receiving emails from it,
send an email to <a rel=3D"nofollow">std-proposal...@isocpp.org</a>.<=
br>
To post to this group, send email to <a rel=3D"nofollow">std-pr...@is=
ocpp.org</a>.<span class=3D""><br>
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/=
group/std-proposals/" rel=3D"nofollow" target=3D"_blank">http://groups.goog=
le.com/a/isocpp.org/group/std-proposals/</a>.<br>
</span></blockquote>
<br>
</div>
</blockquote></div></div><div class=3D""><div class=3D"h5">
<p></p>
-- <br>
<br>
--- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org" target=3D"_=
blank">std-proposals+unsubscribe@isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br>
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/" target=3D"_blank">http://groups.google.com/a/isocpp.org/gro=
up/std-proposals/</a>.<br>
</div></div></blockquote></div><br></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--089e0103009cd7c95505202d5c1d--
.
Author: Patrice Roy <patricer@gmail.com>
Date: Sun, 20 Sep 2015 09:14:59 -0400
Raw View
--047d7bdc12ea4357fe05202d8d2b
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Hi!
In:
This would mean we would have to write:
>
> std::cout << F"% The number of %goods is %count";
>
> (which some have requested anyway).
>
.... you might be referring to my questions. I think I saw the F"..." syntax
as a formated literal, and expected it to be of a given type (assigning it
to a string did seem to be an option in my mind), but reading the
discussions since I can see that might not have been the intention. It
still does seem reasonable to me to treat this as having a type and
interacting with the rest of the type system, but if such was not your
intent I also don't want to drag your proposal in a priori unwanted
directions. I'm guessing others will have the same reflex, that being said,
so it's probably a wise choice to treat this question in the proposal.
Cheers!
2015-09-20 9:01 GMT-04:00 Andrew Tomazos <andrewtomazos@gmail.com>:
> On Sat, Sep 19, 2015 at 12:33 PM, Bengt Gustafsson <
> bengt.gustafsson@beamways.com> wrote:
>
>> - Do we really need to be able to specify the introducer character. Can'=
t
>> % be fixed (with the usual %% escape possibility).
>>
>
> I considered that, but no matter what introducer you pick, there are
> always cases where the introducer is prevalent in the target string. Thi=
s
> occurs in natural language, but is especially the case of code generation=
,
> where you are generating strings for later compilation in C++ or some oth=
er
> programming language. Having the introducer be defined at the start also
> makes it easier to read, as you are reminded what the special token is
> (just like the compiler is).
>
> Compare:
>
> F"The result of %x %% %y is not zero (it is %(x%y))."
>
> with
>
> F"$ The result of $x % $y is not zero (it is $[x%y])."
>
> Similar problematic examples can be found with any set predefined
> introducer or set predefined brackets.
>
> - Wouldn't it be more logical if this resulted in an expanded pack, i.e. =
a
>> number of comma separated parts.
>>
>
> format(std::cout, F"The number of %goods is %count");
>>
>
> No, I think:
>
> std::cout F"% The number of %goods is %count";
>
> is better.
>
> But I am considering changing the definition of an interpolated string to
> be a function call expression of return type std::interpolated_string.
>
> This would mean we would have to write:
>
> std::cout << F"% The number of %goods is %count";
>
> (which some have requested anyway).
>
> But it also means we could also write:
>
> std::string s =3D F"% The number of %goods is %count";
>
> or use it anywhere you can use a string normally.
>
> std::interpolated_string would contain:
> 1. a reference to the constant expression format string and positions of
> embedded expressions (which are known at compile time)
> 2. references to the values of the evaluated embedded expressions for the
> current execution. (calculated at run-time usually, but it should be
> constexpr-compatible)
>
> This means the operator<<(ostream&, interpolated_string) could be defined
> to stream out the substrings and subexpressions just like (and just as
> efficiently) as if you had written << for each.
>
> For the conversion from std::interpolated_string to std::string, it could
> use std::ostringstream internally or some more efficient method.
>
> So consumers of std::interpolated_strings could use operator<<(ostream&,
> std::interpolated_string), or use the conversion from
> std::interpolated_string to std::string implicitly (by just using
> std::string or std::string_view), or they could overload on
> std::interpolated_string.
>
> Users could also overload on std::interpolated_string to implement a
> translation mechanism, as they would have access to both the original
> source code text of the expressions as well as their evaluated values.
>
> std::interpolated_string would actually be a class template parametric on
> the types of the embedded expressions, but that's an implementation detai=
l.
>
>
>> which calls a:
>>
>> template<typename... Ps> void format(ostream&, Ps&&...);
>>
>> Arbitrarily reusing << is a little bit to much of a hack for my taste.
>> Expanding as a pack to be picked up by a variadic template seems more li=
ke
>> modern C++. The upcoming ... << ... type pack expansions
>> of C++17 would make the implementation of format a breeze.
>>
>> Even with a << expansion I would prefer not to introduce an prefix one a=
t
>> the left, it seems more logical to write it out explicitly.
>>
>> - Translation is an important issue.
>>
>> There are utilities which scan the source code to find typically
>> _("string") literals which get translated. This does not seem to play we=
ll
>> with
>> this suggestion. Translation is probably the most important reason for
>> placing the inserts after the string literal in printf and similar, and
>> this makes inline systems like shifting out on cout
>> much harder to translate, and this suggested system even worse, as the
>> parts of the literal can't be "addressed" at runtime so there is no chan=
ce
>> of replacing the string with a translation.
>>
>> Translation is also a main driver behind prefering named inserts, as
>> different languages tend to want to reorder inserted words to get a
>> grammatically correct sentence.
>>
>> This said there are of course uses when translation is not an issue, but
>> I'm a bit worried that making untranslatable strings so much easier to u=
se
>> than translatable strings will make American programmers (who are as laz=
y
>> as all programmers and create many of the most used softwares) convenien=
tly
>> forget about the needs for translation.
>>
>> Of course it is still possible to make a preprocessor which actually
>> mangles the source code inserting the foreign string, but we want to mov=
e
>> away from those ideas towards being able to change language at runtime.
>>
>>
>> Den l=C3=B6rdag 19 september 2015 kl. 00:04:23 UTC+2 skrev Miro Knejp:
>>
>>> Nice, I wanted this so many times already.
>>>
>>> But there are a few points I find a bit strange.
>>>
>>> (1) I don't think operator<< is the right choice. With your proposal it
>>> means I cannot do the very basic thing that works in every language wit=
h
>>> string interpolation:
>>> std::string s =3D F"% Hello %i World!";
>>> auto s =3D F"% Hello %i World!"; // What is auto?
>>> Any proposal that cannot get the above two lines to "just work" with
>>> standard types is simply not good enough in my oppinion.
>>>
>>> I believe to make this work properly one needs some other infrastructur=
e
>>> to exist first. There has to be a way to pass the expression to be
>>> formatted to some function that knows how to format it? Last time I use=
d
>>> string interpolation was in Scala, where the literal prefix is actually=
the
>>> name of a function to call with the transformed string. I don't know
>>> whether we can ever introduce user defined string prefixes, but who kno=
ws.
>>> However, I think for now, a more flexible way is to combine both prefix=
and
>>> suffix. Let me try to explain with an example using your syntax where
>>> applicable:
>>>
>>> auto s =3D F"% Hello %i World: %{x =3D=3D 1 ? "a" : "b"}!"_my_string;
>>>
>>> This is translated to something like:
>>> auto&& __context =3D operator""_my_string();
>>> __context("Hello ");
>>> __context(i);
>>> __context(" World: ");
>>> __context(x =3D=3D 1 ? "a" : "b"); // Note the correct handling of lite=
rals
>>> inside %{ }
>>> __context("!");
>>> auto s =3D move(__context).get();d
>>>
>>> Whatever x this UDL returns must make the expression x(expr) well-forme=
d
>>> for every expr that is an embedded expression of the string literal, or=
an
>>> actual string literal. Unfortunately this requires that a string litera=
l
>>> with *only* the introducing prefix is ill-formed, unless we make the
>>> exception that a lacking suffix uses a standard-library context that
>>> produces a std::string (whether this is a good idea is debatable, but i=
t
>>> sure as hell would be friggin' convenient). Assuming no exceptions the
>>> get() method is invoked exactly once and therefore can use this knowled=
ge
>>> to move the result out of the object. The move() helps to prefer an
>>> rvalue-qualified overload if one exists.
>>>
>>> The UDL is declared as usual but takes no parameters:
>>>
>>> MyStringBuilder operator""_my_string();
>>>
>>> This suggests that the context cannot take constructor parameter, which
>>> may be a severe limitation. If constructor arguments are desirable then=
it
>>> would certainly need a syntax that distinguishes this UDL from others (=
or
>>> find a solution other than UDLs). An interpolated string that is used f=
or a
>>> purpose other than being stored in some location (like performing outpu=
t)
>>> it is more efficient to perform the output directly, which I guess is t=
he
>>> motivation of using operator<<. A context that can take parameters coul=
d
>>> make this possible, for example using llvm::raw_ostream (a faster
>>> alternative to std::ostream):
>>>
>>> using namespace llvm;
>>> raw_ostream out;
>>> F"% Hello %i World: %{x =3D=3D 1 ? "a" : "b"}!"_raw_ostream{out};
>>>
>>> Using a wrapper around raw_ostream that uses operator() instead of
>>> operator<< can directly insert into the stream with zero overhead compa=
red
>>> to a handwritten sequence of statements (same applies for std::ostream)=
..
>>> What is weird about this syntax, though, is the placement of the "thing=
"
>>> that does the actual work at the end of the expression instead of the f=
ront
>>> as it were in a function call. Your approach with the receiving object =
at
>>> the front makes it at least *look* better. Maybe these can somehow be
>>> combined.
>>>
>>> Regardless of whether my approach here works or not, I think a solution
>>> that is not directly coupled to a certain operator (except the call
>>> operator) is less restricted and far more flexible. Function objects ar=
e
>>> way more common than insertion operators and maybe we can slow down the
>>> spreading abuse of operator<< . I know of some classes that could be an
>>> immediate drop-in and would "just work" with minimal adjustments. If th=
e
>>> standard-provided string context uses ADL-based lookup to (for example)
>>> to_string(x), or to_string(context, x), you have a convenient customiza=
tion
>>> point to support the default string interpolation.
>>>
>>> (2) Even if you stick to operator<< I find it *very* disturbing that
>>> there is no << between cout and the literal.
>>>
>>> cout F"% ..."; // Where's the operator? No call parens? Am I blind? Is
>>> the sky falling?
>>> cout << F"% ..."; // Ah, there it is!
>>>
>>> It also means that with your approach I couldn't pass the result of the
>>> interpolated literal as function parameter.
>>>
>>> foo(F"% ...") // ill-formed: foo(<< "...")
>>>
>>> (Which would be also ill-formed if the compiler can't find a matching
>>> operator<<, but that's a different issue.)
>>>
>>> It has to be as convenient and flexible as possible for the end-user.
>>>
>>> (3) I think it's very strange to have the escaping character be part of
>>> the string literal. To me it lacks a clear separation between the actua=
l
>>> literal content and the introducer. Look at raw literals:
>>> R"delimiter(...)delimiter" where there is a clearly visible distinction
>>> between "content" and "non-content". Not sure how to do this properly,
>>> especially regarding the next point:
>>>
>>> (4) How does this combine with the other literal prefixes, like R?
>>>
>>> (5) There are actually two proposals in there: string interpolation and
>>> multiline literals. Those are completely orthogonal and you don't need =
the
>>> one to implement the other. You'd be better off making these two separa=
te
>>> (independent) proposals.
>>>
>>> Am 18.09.2015 um 22:21 schrieb Andrew Tomazos:
>>>
>>> Please find attached a very very rough draft of a proposal entitled
>>> "Interpolated String Literals".
>>>
>>> Mainly after encouragement or discouragement, and any high-level
>>> thoughts you might have about it.
>>>
>>> --
>>>
>>> ---
>>> You received this message because you are subscribed to the Google
>>> Groups "ISO C++ Standard - Future Proposals" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to std-proposal...@isocpp.org.
>>> To post to this group, send email to std-pr...@isocpp.org.
>>> Visit this group at
>>> http://groups.google.com/a/isocpp.org/group/std-proposals/.
>>>
>>>
>>> --
>>
>> ---
>> You received this message because you are subscribed to the Google Group=
s
>> "ISO C++ Standard - Future Proposals" group.
>> To unsubscribe from this group and stop receiving emails from it, send a=
n
>> email to std-proposals+unsubscribe@isocpp.org.
>> To post to this group, send email to std-proposals@isocpp.org.
>> Visit this group at
>> http://groups.google.com/a/isocpp.org/group/std-proposals/.
>>
>
> --
>
> ---
> You received this message because you are subscribed to the Google Groups
> "ISO C++ Standard - Future Proposals" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to std-proposals+unsubscribe@isocpp.org.
> To post to this group, send email to std-proposals@isocpp.org.
> Visit this group at
> http://groups.google.com/a/isocpp.org/group/std-proposals/.
>
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
--047d7bdc12ea4357fe05202d8d2b
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div>Hi!<br><br>In:<br><br><blockquote style=3D"margin:0px=
0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" cla=
ss=3D"gmail_quote"><div>This would mean we would have to write:</div><div><=
br></div><div><div>=C2=A0 std::cout << F"% The number of %goods =
is %count";</div></div><div><br></div></blockquote><blockquote style=
=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding=
-left:1ex" class=3D"gmail_quote"><div>(which some have requested anyway).<b=
r></div></blockquote><div><br></div>... you might be referring to my questi=
ons. I think I saw the F"..." syntax as a formated literal, and e=
xpected it to be of a given type (assigning it to a string did seem to be a=
n option in my mind), but reading the discussions since I can see that migh=
t not have been the intention. It still does seem reasonable to me to treat=
this as having a type and interacting with the rest of the type system, bu=
t if such was not your intent I also don't want to drag your proposal i=
n a priori unwanted directions. I'm guessing others will have the same =
reflex, that being said, so it's probably a wise choice to treat this q=
uestion in the proposal.<br><br></div>Cheers!<br><div><div><br><br></div></=
div></div><div class=3D"gmail_extra"><br><div class=3D"gmail_quote">2015-09=
-20 9:01 GMT-04:00 Andrew Tomazos <span dir=3D"ltr"><<a href=3D"mailto:a=
ndrewtomazos@gmail.com" target=3D"_blank">andrewtomazos@gmail.com</a>></=
span>:<br><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;bord=
er-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div class=3D"gma=
il_extra"><div class=3D"gmail_quote"><span class=3D"">On Sat, Sep 19, 2015 =
at 12:33 PM, Bengt Gustafsson <span dir=3D"ltr"><<a href=3D"mailto:bengt=
..gustafsson@beamways.com" target=3D"_blank">bengt.gustafsson@beamways.com</=
a>></span> wrote:<br><blockquote class=3D"gmail_quote" style=3D"margin:0=
px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);b=
order-left-style:solid;padding-left:1ex"><div dir=3D"ltr"><div>- Do we real=
ly need to be able to specify the introducer character. Can't % be fixe=
d (with the usual %% escape possibility).</div></div></blockquote><div><br>=
</div></span><div>I considered that, but no matter what introducer you pick=
, there are always cases where the introducer is prevalent in the target st=
ring.=C2=A0 This occurs in natural language, but is especially the case of =
code generation, where you are generating strings for later compilation in =
C++ or some other programming language.=C2=A0 Having the introducer be defi=
ned at the start also makes it easier to read, as you are reminded what the=
special token is (just like the compiler is).</div><div><br></div><div>Com=
pare:</div><div><br></div><div>=C2=A0 =C2=A0F"The result of %x %% %y i=
s not zero (it is %(x%y))."</div><div><br></div><div>with</div><div><b=
r></div><div>=C2=A0 =C2=A0F"$ The result of $x % $y is not zero (it is=
$[x%y])."</div><div><br></div><div>Similar problematic examples can b=
e found with any set predefined introducer or set predefined brackets.</div=
><span class=3D""><div><br></div><blockquote class=3D"gmail_quote" style=3D=
"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,2=
04,204);border-left-style:solid;padding-left:1ex"><div dir=3D"ltr"><div></d=
iv><div>- Wouldn't it be more logical if this resulted in an expanded p=
ack, i.e. a number of comma separated parts.</div></div></blockquote><div><=
br></div></span><span class=3D""><blockquote class=3D"gmail_quote" style=3D=
"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,2=
04,204);border-left-style:solid;padding-left:1ex"><div dir=3D"ltr"><div>for=
mat(std::cout, F"The number of %goods is %count");</div></div></b=
lockquote><div><br></div></span><div>No, I think:</div><div><br></div><div>=
=C2=A0 std::cout F"% The number of %goods is %count";</div><div><=
br></div><div>is better.</div><div><br></div><div>But I am considering chan=
ging the definition of an interpolated string to be a function call express=
ion of return type std::interpolated_string.<br></div><div><br></div><div>T=
his would mean we would have to write:</div><div><br></div><div><div>=C2=A0=
std::cout << F"% The number of %goods is %count";</div></d=
iv><div><br></div><div>(which some have requested anyway).</div><div><br></=
div><div>But it also means we could also write:</div><div><br></div><div>=
=C2=A0 std::string s =3D F"% The number of %goods is %count";</di=
v><div><br></div><div>or use it anywhere you can use a string normally.</di=
v><div><br></div><div>std::interpolated_string would contain:<br></div><div=
>1. a reference to the constant expression format string and positions of e=
mbedded expressions (which are known at compile time)</div><div>2. referenc=
es to the values of the evaluated embedded expressions for the current exec=
ution. (calculated at run-time usually, but it should be constexpr-compatib=
le)</div><div><br></div><div>This means the operator<<(ostream&, =
interpolated_string) could be defined to stream out the substrings and sube=
xpressions just like (and just as efficiently) as if you had written <&l=
t; for each.</div><div><br></div><div>For the conversion from std::interpol=
ated_string to std::string, it could use std::ostringstream internally or s=
ome more efficient method.</div><div><br></div><div>So consumers of std::in=
terpolated_strings could use operator<<(ostream&, std::interpolat=
ed_string), or use the conversion from std::interpolated_string to std::str=
ing implicitly (by just using std::string or std::string_view), or they cou=
ld overload on std::interpolated_string.</div><div><br></div><div>Users cou=
ld also overload on std::interpolated_string to implement a translation mec=
hanism, as they would have access to both the original source code text of =
the expressions as well as their evaluated values.</div><div><br></div><div=
>std::interpolated_string would actually be a class template parametric on =
the types of the embedded expressions, but that's an implementation det=
ail.</div><div><div class=3D"h5"><div><br></div><blockquote class=3D"gmail_=
quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-=
color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir=
=3D"ltr"><div><br></div><div>which calls a:</div><div><br></div><div>templa=
te<typename... Ps> void format(ostream&, Ps&&...);</div><=
div><br></div><div>Arbitrarily reusing << is a little bit to much of =
a hack for my taste. Expanding as a pack to be picked up by a variadic temp=
late seems more like modern C++. The upcoming ... << ... type pack ex=
pansions</div><div>of C++17 would make the implementation of format a breez=
e.</div><div><br></div><div>Even with a << expansion I would prefer n=
ot to introduce an prefix one at the left, it seems more logical to write i=
t out explicitly.</div><div><br></div><div>- Translation is an important is=
sue.</div><div><br></div><div>There are utilities which scan the source cod=
e to find typically _("string") literals which get translated. Th=
is does not seem to play well with</div><div>this suggestion. Translation i=
s probably the most important reason for placing the inserts after the stri=
ng literal in printf and similar, and this makes inline systems like shifti=
ng out on cout</div><div>much harder to translate, and this suggested syste=
m even worse, as the parts of the literal can't be "addressed"=
; at runtime so there is no chance of replacing the string with a translati=
on.</div><div><br></div><div>Translation is also a main driver behind prefe=
ring named inserts, as different languages tend to want to reorder inserted=
words to get a grammatically correct sentence.</div><div><br></div><div>Th=
is said there are of course uses when translation is not an issue, but I=
9;m a bit worried that making untranslatable strings so much easier to use =
than translatable strings will make American programmers (who are as lazy a=
s all programmers and create many of the most used softwares) conveniently =
forget about the needs for translation.</div><div><br></div><div>Of course =
it is still possible to make a preprocessor which actually mangles the sour=
ce code inserting the foreign string, but we want to move away from those i=
deas towards being able to change language at runtime.</div><div><div><div>=
<br><br>Den l=C3=B6rdag 19 september 2015 kl. 00:04:23 UTC+2 skrev Miro Kne=
jp:</div></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0p=
x 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-lef=
t-style:solid;padding-left:1ex">
=20
=20
=20
<div bgcolor=3D"#FFFFFF" text=3D"#000000"><div><div>
Nice, I wanted this so many times already.<br>
<br>
But there are a few points I find a bit strange.<br>
<br>
(1) I don't think operator<< is the right choice. With your
proposal it means I cannot do the very basic thing that works in
every language with string interpolation:<br>
std::string s =3D F"% Hello %i World!";<br>
auto s =3D F"% Hello %i World!"; // What is auto?<br>
Any proposal that cannot get the above two lines to "just work&quo=
t; with
standard types is simply not good enough in my oppinion.<br>
<br>
I believe to make this work properly one needs some other
infrastructure to exist first. There has to be a way to pass the
expression to be formatted to some function that knows how to format
it? Last time I used string interpolation was in Scala, where the
literal prefix is actually the name of a function to call with the
transformed string. I don't know whether we can ever introduce user
defined string prefixes, but who knows. However, I think for now, a
more flexible way is to combine both prefix and suffix. Let me try
to explain with an example using your syntax where applicable:<br>
<br>
auto s =3D F"% Hello %i World: %{x =3D=3D 1 ? "a" : &quo=
t;b"}!"_my_string;<br>
<br>
This is translated to something like:<br>
auto&& __context =3D operator""_my_string();<br>
__context("Hello ");<br>
__context(i);<br>
__context(" World: ");<br>
__context(x =3D=3D 1 ? "a" : "b"); // Note the corr=
ect handling of
literals inside %{ }<br>
__context("!");<br>
auto s =3D move(__context).get();d<br>
<br>
Whatever x this UDL returns must make the expression x(expr)
well-formed for every expr that is an embedded expression of the
string literal, or an actual string literal. Unfortunately this
requires that a string literal with *only* the introducing prefix is
ill-formed, unless we make the exception that a lacking suffix uses
a standard-library context that produces a std::string (whether this
is a good idea is debatable, but it sure as hell would be friggin'
convenient). Assuming no exceptions the get() method is invoked
exactly once and therefore can use this knowledge to move the result
out of the object. The move() helps to prefer an rvalue-qualified
overload if one exists.<br>
<br>
The UDL is declared as usual but takes no parameters:<br>
<br>
MyStringBuilder operator""_my_string();<br>
<br>
This suggests that the context cannot take constructor parameter,
which may be a severe limitation. If constructor arguments are
desirable then it would certainly need a syntax that distinguishes
this UDL from others (or find a solution other than UDLs). An
interpolated string that is used for a purpose other than being
stored in some location (like performing output) it is more
efficient to perform the output directly, which I guess is the
motivation of using operator<<. A context that can take
parameters could make this possible, for example using
llvm::raw_ostream (a faster alternative to std::ostream):<br>
<br>
using namespace llvm;<br>
raw_ostream out;<br>
F"% Hello %i World: %{x =3D=3D 1 ? "a" : "b"}!=
"_raw_ostream{out};<br>
<br>
Using a wrapper around raw_ostream that uses operator() instead of
operator<< can directly insert into the stream with zero
overhead compared to a handwritten sequence of statements (same
applies for std::ostream). What is weird about this syntax, though,
is the placement of the "thing" that does the actual work at =
the end
of the expression instead of the front as it were in a function
call. Your approach with the receiving object at the front makes it
at least *look* better. Maybe these can somehow be combined.<br>
<br>
Regardless of whether my approach here works or not, I think a
solution that is not directly coupled to a certain operator (except
the call operator) is less restricted and far more flexible.
Function objects are way more common than insertion operators and
maybe we can slow down the spreading abuse of operator<< . I
know of some classes that could be an immediate drop-in and would
"just work" with minimal adjustments. If the standard-provide=
d
string context uses ADL-based lookup to (for example) to_string(x),
or to_string(context, x), you have a convenient customization point
to support the default string interpolation.<br>
<br>
(2) Even if you stick to operator<< I find it *very*
disturbing that there is no << between cout and the literal.<br>
<br>
cout F"% ..."; // Where's the operator? No call parens? A=
m I blind?
Is the sky falling?<br>
cout << F"% ..."; // Ah, there it is!<br>
<br>
It also means that with your approach I couldn't pass the result of
the interpolated literal as function parameter.<br>
<br>
foo(F"% ...") // ill-formed: foo(<< "...")<br=
>
<br>
(Which would be also ill-formed if the compiler can't find a
matching operator<<, but that's a different issue.)<br>
<br>
It has to be as convenient and flexible as possible for the
end-user.<br>
<br>
(3) I think it's very strange to have the escaping character be par=
t
of the string literal. To me it lacks a clear separation between the
actual literal content and the introducer. Look at raw literals:
R"delimiter(...)delimiter" where there is a clearly visible
distinction between "content" and "non-content". No=
t sure how to do
this properly, especially regarding the next point:<br>
<br>
(4) How does this combine with the other literal prefixes, like R?<br>
<br>
(5) There are actually two proposals in there: string interpolation
and multiline literals. Those are completely orthogonal and you
don't need the one to implement the other. You'd be better off
making these two separate (independent) proposals.<br>
<br>
<div>Am 18.09.2015 um 22:21 schrieb Andrew
Tomazos:<br>
</div>
</div></div><blockquote type=3D"cite"><div><div>
<div dir=3D"ltr">Please find attached a very very rough draft of a
proposal entitled "Interpolated String Literals".
<div><br>
</div>
<div>Mainly after encouragement or discouragement, and any
high-level thoughts you might have about it.</div>
<div><br>
</div>
</div>
-- <br>
<br>
--- <br>
You received this message because you are subscribed to the Google
Groups "ISO C++ Standard - Future Proposals" group.<br></di=
v></div>
To unsubscribe from this group and stop receiving emails from it,
send an email to <a rel=3D"nofollow">std-proposal...@isocpp.org</a>.<=
br>
To post to this group, send email to <a rel=3D"nofollow">std-pr...@is=
ocpp.org</a>.<span><br>
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/=
group/std-proposals/" rel=3D"nofollow" target=3D"_blank">http://groups.goog=
le.com/a/isocpp.org/group/std-proposals/</a>.<br>
</span></blockquote>
<br>
</div>
</blockquote></div></div><div><div>
<p></p>
-- <br>
<br>
--- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org" target=3D"_=
blank">std-proposals+unsubscribe@isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br>
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/" target=3D"_blank">http://groups.google.com/a/isocpp.org/gro=
up/std-proposals/</a>.<br>
</div></div></blockquote></div></div></div><br></div></div><div class=3D"HO=
EnZb"><div class=3D"h5">
<p></p>
-- <br>
<br>
--- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org" target=3D"_=
blank">std-proposals+unsubscribe@isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br>
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/" target=3D"_blank">http://groups.google.com/a/isocpp.org/gro=
up/std-proposals/</a>.<br>
</div></div></blockquote></div><br></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--047d7bdc12ea4357fe05202d8d2b--
.
Author: Andrew Tomazos <andrewtomazos@gmail.com>
Date: Sun, 20 Sep 2015 16:11:58 +0200
Raw View
--047d7b874e5014669305202e5935
Content-Type: text/plain; charset=UTF-8
On Sun, Sep 20, 2015 at 3:14 PM, Patrice Roy <patricer@gmail.com> wrote:
> Hi!
>
> In:
>
> This would mean we would have to write:
>>
>> std::cout << F"% The number of %goods is %count";
>>
>> (which some have requested anyway).
>>
>
> ... you might be referring to my questions. I think I saw the F"..."
> syntax as a formated literal, and expected it to be of a given type
> (assigning it to a string did seem to be an option in my mind), but reading
> the discussions since I can see that might not have been the intention. It
> still does seem reasonable to me to treat this as having a type and
> interacting with the rest of the type system, but if such was not your
> intent I also don't want to drag your proposal in a priori unwanted
> directions. I'm guessing others will have the same reflex, that being said,
> so it's probably a wise choice to treat this question in the proposal.
>
Thanks Patrice. The proposal has been discussed in other places, and other
people had the same request. I think an interpolated string literal can be
defined in such a way that it is an expression, and still allow "streaming"
performance w.r.t. to ostream - as outlined in my last post. The extra <<
doesn't do too much damage to the syntax.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
--047d7b874e5014669305202e5935
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><div class=3D"gmail_extra"><br><div class=3D"gmail_quo=
te">On Sun, Sep 20, 2015 at 3:14 PM, Patrice Roy <span dir=3D"ltr"><<a h=
ref=3D"mailto:patricer@gmail.com" target=3D"_blank">patricer@gmail.com</a>&=
gt;</span> wrote:<br><blockquote class=3D"gmail_quote" style=3D"margin:0px =
0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);bord=
er-left-style:solid;padding-left:1ex"><div dir=3D"ltr"><div>Hi!<br><br>In:<=
span><br><br><blockquote style=3D"margin:0px 0px 0px 0.8ex;border-left-widt=
h:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-le=
ft:1ex" class=3D"gmail_quote"><div>This would mean we would have to write:<=
/div><div><br></div><div><div>=C2=A0 std::cout << F"% The number=
of %goods is %count";</div></div><div><br></div></blockquote><blockqu=
ote style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-sty=
le:solid;border-left-color:rgb(204,204,204);padding-left:1ex" class=3D"gmai=
l_quote"><div>(which some have requested anyway).<br></div></blockquote><di=
v><br></div></span>... you might be referring to my questions. I think I sa=
w the F"..." syntax as a formated literal, and expected it to be =
of a given type (assigning it to a string did seem to be an option in my mi=
nd), but reading the discussions since I can see that might not have been t=
he intention. It still does seem reasonable to me to treat this as having a=
type and interacting with the rest of the type system, but if such was not=
your intent I also don't want to drag your proposal in a priori unwant=
ed directions. I'm guessing others will have the same reflex, that bein=
g said, so it's probably a wise choice to treat this question in the pr=
oposal.<br></div></div></blockquote><div>=C2=A0</div><div>Thanks Patrice.=
=C2=A0 The proposal has been discussed in other places, and other people ha=
d the same request.=C2=A0 I think an interpolated string literal can be def=
ined in such a way that it is an expression, and still allow "streamin=
g" performance w.r.t. to ostream - as outlined in my last post.=C2=A0 =
The extra << doesn't do too much damage to the syntax.<br></div><=
div><br></div></div></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--047d7b874e5014669305202e5935--
.
Author: Miro Knejp <miro.knejp@gmail.com>
Date: Sun, 20 Sep 2015 22:19:10 +0200
Raw View
--Apple-Mail=_1F1C4633-8183-46B5-8820-2DABC150F546
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=UTF-8
> On 20 Sep 2015, at 15:01 , Andrew Tomazos <andrewtomazos@gmail.com> wrote=
:
>=20
> On Sat, Sep 19, 2015 at 12:33 PM, Bengt Gustafsson <bengt.gustafsson@beam=
ways.com <mailto:bengt.gustafsson@beamways.com>> wrote:
> - Do we really need to be able to specify the introducer character. Can't=
% be fixed (with the usual %% escape possibility).
>=20
> I considered that, but no matter what introducer you pick, there are alwa=
ys cases where the introducer is prevalent in the target string. This occu=
rs in natural language, but is especially the case of code generation, wher=
e you are generating strings for later compilation in C++ or some other pro=
gramming language. Having the introducer be defined at the start also make=
s it easier to read, as you are reminded what the special token is (just li=
ke the compiler is).
>=20
> Compare:
>=20
> F"The result of %x %% %y is not zero (it is %(x%y))."
>=20
> with
>=20
> F"$ The result of $x % $y is not zero (it is $[x%y])."
>=20
> Similar problematic examples can be found with any set predefined introdu=
cer or set predefined brackets.
The brackets are not a problem as they must be preceded by the introducing =
character and contain a balanced token sequence, so the choice of brackets =
does not matter. I don=E2=80=99t really mind being able to chose the introd=
ucer, only that it is part of the string, meaning the compiler truncates my=
string! There is a lacking visual separation of data and metadata. I also =
think there should be a predefined sensible default introducer ($ makes sen=
se as it is not a valid identifier character or operator in C++ code and it=
s occurrence in natural language is rather rare as a currency symbol) which=
can be optionally overridden if needed.
>=20
> - Wouldn't it be more logical if this resulted in an expanded pack, i.e. =
a number of comma separated parts.
>=20
> format(std::cout, F"The number of %goods is %count");
>=20
> No, I think:
>=20
> std::cout F"% The number of %goods is %count";
>=20
> is better.
=E2=80=9Cbetter=E2=80=9D in what way? Does the syntax please you more or do=
es it function better?
>=20
> But I am considering changing the definition of an interpolated string to=
be a function call expression of return type std::interpolated_string.
This is a very strange limitation. By that logic all user defined literals =
should return a std::udl_string, which I think people would agree is silly.=
So why limit interpolated strings in that way? If the interpolated string =
is supposed to be sugar for transforming a sequence of expressions into one=
, then transforming it into a call to a user-defined function is the most f=
lexible thing the proposal can provide. If F=E2=80=9D$ x + y =3D ${x + y}=
=E2=80=9D_foo (whatever the syntax may be) is translated to foo(=E2=80=9Cx =
+ y =3D =E2=80=9C, x + y) then the type of the interpolated string is the r=
esult type of foo(). This is a very powerful mechanism that may not be limi=
ted to strings only, If people want to capture arguments by reference they =
can decide to do so. Let the users decide how to process the interpolated s=
tring literal, just give them the hooks into the compiler=E2=80=99s magic.
>=20
> This would mean we would have to write:
>=20
> std::cout << F"% The number of %goods is %count";
>=20
> (which some have requested anyway).
>=20
> But it also means we could also write:
>=20
> std::string s =3D F"% The number of %goods is %count";
>=20
> or use it anywhere you can use a string normally.
>=20
> std::interpolated_string would contain:
> 1. a reference to the constant expression format string and positions of =
embedded expressions (which are known at compile time)
> 2. references to the values of the evaluated embedded expressions for the=
current execution. (calculated at run-time usually, but it should be const=
expr-compatible)
You basically just described how to call a function.
>=20
> This means the operator<<(ostream&, interpolated_string) could be defined=
to stream out the substrings and subexpressions just like (and just as eff=
iciently) as if you had written << for each.
>=20
> For the conversion from std::interpolated_string to std::string, it could=
use std::ostringstream internally or some more efficient method.
>=20
> So consumers of std::interpolated_strings could use operator<<(ostream&, =
std::interpolated_string), or use the conversion from std::interpolated_str=
ing to std::string implicitly (by just using std::string or std::string_vie=
w), or they could overload on std::interpolated_string.
>=20
> Users could also overload on std::interpolated_string to implement a tran=
slation mechanism, as they would have access to both the original source co=
de text of the expressions as well as their evaluated values.
>=20
> std::interpolated_string would actually be a class template parametric on=
the types of the embedded expressions, but that's an implementation detail=
..
It is not an implementation detail because it is exposed in the interface o=
f std::interpolated_string which impacts people=E2=80=99s function signatur=
es.
I still don=E2=80=99t understand the purpose of this limitation. Who benefi=
ts from std::interpolated_string? Why isn=E2=80=99t there a std::udl_string=
? If we allow the interpolated literal to be converted to a user-defined fu=
nction call it can return whatever the user needs. Add meaningful defaults =
to the standard library to cover the most common use cases, but leave the c=
ustomization point open for advanced users. I believe it=E2=80=99s easier t=
o specify the behavior of =E2=80=9Csplit up this literal and call a functio=
n with these arguments=E2=80=9D compared to =E2=80=9Csplit up this literal,=
remember the expression result references and pack them into a magic std t=
ype, which either needs to be a template or be type-erased=E2=80=9D.
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
--Apple-Mail=_1F1C4633-8183-46B5-8820-2DABC150F546
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset=UTF-8
<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html charset=
=3Dutf-8"></head><body style=3D"word-wrap: break-word; -webkit-nbsp-mode: s=
pace; -webkit-line-break: after-white-space;" class=3D""><br class=3D""><di=
v><blockquote type=3D"cite" class=3D""><div class=3D"">On 20 Sep 2015, at 1=
5:01 , Andrew Tomazos <<a href=3D"mailto:andrewtomazos@gmail.com" class=
=3D"">andrewtomazos@gmail.com</a>> wrote:</div><br class=3D"Apple-interc=
hange-newline"><div class=3D""><div dir=3D"ltr" class=3D""><div class=3D"gm=
ail_extra"><div class=3D"gmail_quote">On Sat, Sep 19, 2015 at 12:33 PM, Ben=
gt Gustafsson <span dir=3D"ltr" class=3D""><<a href=3D"mailto:bengt.gust=
afsson@beamways.com" target=3D"_blank" class=3D"">bengt.gustafsson@beamways=
..com</a>></span> wrote:<br class=3D""><blockquote class=3D"gmail_quote" =
style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:r=
gb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir=3D"ltr" =
class=3D""><div class=3D"">- Do we really need to be able to specify the in=
troducer character. Can't % be fixed (with the usual %% escape possibility)=
..</div></div></blockquote><div class=3D""><br class=3D""></div><div class=
=3D"">I considered that, but no matter what introducer you pick, there are =
always cases where the introducer is prevalent in the target string. =
This occurs in natural language, but is especially the case of code generat=
ion, where you are generating strings for later compilation in C++ or some =
other programming language. Having the introducer be defined at the s=
tart also makes it easier to read, as you are reminded what the special tok=
en is (just like the compiler is).</div><div class=3D""><br class=3D""></di=
v><div class=3D"">Compare:</div><div class=3D""><br class=3D""></div><div c=
lass=3D""> F"The result of %x %% %y is not zero (it is %(x%y)).=
"</div><div class=3D""><br class=3D""></div><div class=3D"">with</div><div =
class=3D""><br class=3D""></div><div class=3D""> F"$ The result=
of $x % $y is not zero (it is $[x%y])."</div><div class=3D""><br class=3D"=
"></div><div class=3D"">Similar problematic examples can be found with any =
set predefined introducer or set predefined brackets.</div></div></div></di=
v></div></blockquote>The brackets are not a problem as they must be precede=
d by the introducing character and contain a balanced token sequence, so th=
e choice of brackets does not matter. I don=E2=80=99t really mind being abl=
e to chose the introducer, only that it is part of the string, meaning the =
compiler truncates my string! There is a lacking visual separation of data =
and metadata. I also think there should be a predefined sensible default in=
troducer ($ makes sense as it is not a valid identifier character or operat=
or in C++ code and its occurrence in natural language is rather rare as a c=
urrency symbol) which can be optionally overridden if needed.<br class=3D""=
><blockquote type=3D"cite" class=3D""><div class=3D""><div dir=3D"ltr" clas=
s=3D""><div class=3D"gmail_extra"><div class=3D"gmail_quote"><div class=3D"=
"><br class=3D""></div><blockquote class=3D"gmail_quote" style=3D"margin:0p=
x 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);bo=
rder-left-style:solid;padding-left:1ex"><div dir=3D"ltr" class=3D""><div cl=
ass=3D""></div><div class=3D"">- Wouldn't it be more logical if this result=
ed in an expanded pack, i.e. a number of comma separated parts.</div></div>=
</blockquote><div class=3D""><br class=3D""></div><blockquote class=3D"gmai=
l_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-lef=
t-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir=
=3D"ltr" class=3D""><div class=3D"">format(std::cout, F"The number of %good=
s is %count");</div></div></blockquote><div class=3D""><br class=3D""></div=
><div class=3D"">No, I think:</div><div class=3D""><br class=3D""></div><di=
v class=3D""> std::cout F"% The number of %goods is %count";</div><di=
v class=3D""><br class=3D""></div><div class=3D"">is better.</div></div></d=
iv></div></div></blockquote>=E2=80=9Cbetter=E2=80=9D in what way? Does the =
syntax please you more or does it function better?<br class=3D""><blockquot=
e type=3D"cite" class=3D""><div class=3D""><div dir=3D"ltr" class=3D""><div=
class=3D"gmail_extra"><div class=3D"gmail_quote"><div class=3D""><br class=
=3D""></div><div class=3D"">But I am considering changing the definition of=
an interpolated string to be a function call expression of return type std=
::interpolated_string.<br class=3D""></div></div></div></div></div></blockq=
uote>This is a very strange limitation. By that logic all user defined lite=
rals should return a std::udl_string, which I think people would agree is s=
illy. So why limit interpolated strings in that way? If the interpolated st=
ring is supposed to be sugar for transforming a sequence of expressions int=
o one, then transforming it into a call to a user-defined function is the m=
ost flexible thing the proposal can provide. If F=E2=80=9D$ x + y =3D ${x +=
y}=E2=80=9D_foo (whatever the syntax may be) is translated to foo(=E2=80=
=9Cx + y =3D =E2=80=9C, x + y) then the type of the interpolated string is =
the result type of foo(). This is a very powerful mechanism that may not be=
limited to strings only, If people want to capture arguments by reference =
they can decide to do so. Let the users decide how to process the interpola=
ted string literal, just give them the hooks into the compiler=E2=80=99s ma=
gic.<br class=3D""><blockquote type=3D"cite" class=3D""><div class=3D""><di=
v dir=3D"ltr" class=3D""><div class=3D"gmail_extra"><div class=3D"gmail_quo=
te"><div class=3D""><br class=3D""></div><div class=3D"">This would mean we=
would have to write:</div><div class=3D""><br class=3D""></div><div class=
=3D""><div class=3D""> std::cout << F"% The number of %goods is=
%count";</div></div><div class=3D""><br class=3D""></div><div class=3D"">(=
which some have requested anyway).</div><div class=3D""><br class=3D""></di=
v><div class=3D"">But it also means we could also write:</div><div class=3D=
""><br class=3D""></div><div class=3D""> std::string s =3D F"% The nu=
mber of %goods is %count";</div><div class=3D""><br class=3D""></div><div c=
lass=3D"">or use it anywhere you can use a string normally.</div><div class=
=3D""><br class=3D""></div><div class=3D"">std::interpolated_string would c=
ontain:<br class=3D""></div><div class=3D"">1. a reference to the constant =
expression format string and positions of embedded expressions (which are k=
nown at compile time)</div><div class=3D"">2. references to the values of t=
he evaluated embedded expressions for the current execution. (calculated at=
run-time usually, but it should be constexpr-compatible)</div></div></div>=
</div></div></blockquote>You basically just described how to call a functio=
n.<br class=3D""><blockquote type=3D"cite" class=3D""><div class=3D""><div =
dir=3D"ltr" class=3D""><div class=3D"gmail_extra"><div class=3D"gmail_quote=
"><div class=3D""><br class=3D""></div><div class=3D"">This means the opera=
tor<<(ostream&, interpolated_string) could be defined to stream o=
ut the substrings and subexpressions just like (and just as efficiently) as=
if you had written << for each.</div><div class=3D""><br class=3D"">=
</div><div class=3D"">For the conversion from std::interpolated_string to s=
td::string, it could use std::ostringstream internally or some more efficie=
nt method.</div><div class=3D""><br class=3D""></div><div class=3D"">So con=
sumers of std::interpolated_strings could use operator<<(ostream&=
, std::interpolated_string), or use the conversion from std::interpolated_s=
tring to std::string implicitly (by just using std::string or std::string_v=
iew), or they could overload on std::interpolated_string.</div><div class=
=3D""><br class=3D""></div><div class=3D"">Users could also overload on std=
::interpolated_string to implement a translation mechanism, as they would h=
ave access to both the original source code text of the expressions as well=
as their evaluated values.</div><div class=3D""><br class=3D""></div><div =
class=3D"">std::interpolated_string would actually be a class template para=
metric on the types of the embedded expressions, but that's an implementati=
on detail.</div></div></div></div></div></blockquote>It is not an implement=
ation detail because it is exposed in the interface of std::interpolated_st=
ring which impacts people=E2=80=99s function signatures.</div><div><br clas=
s=3D"">I still don=E2=80=99t understand the purpose of this limitation. Who=
benefits from std::interpolated_string? Why isn=E2=80=99t there a std::udl=
_string? If we allow the interpolated literal to be converted to a user-def=
ined function call it can return whatever the user needs. Add meaningful de=
faults to the standard library to cover the most common use cases, but leav=
e the customization point open for advanced users. I believe it=E2=80=99s e=
asier to specify the behavior of =E2=80=9Csplit up this literal and call a =
function with these arguments=E2=80=9D compared to =E2=80=9Csplit up this l=
iteral, remember the expression result references and pack them into a magi=
c std type, which either needs to be a template or be type-erased=E2=80=9D.=
</div><div><br class=3D""></div></body></html>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--Apple-Mail=_1F1C4633-8183-46B5-8820-2DABC150F546--
.
Author: Jim Porter <jvp4846@g.rit.edu>
Date: Sun, 20 Sep 2015 15:58:35 -0500
Raw View
On 9/18/2015 3:21 PM, Andrew Tomazos wrote:
> Please find attached a very very rough draft of a proposal entitled
> "Interpolated String Literals".
>
> Mainly after encouragement or discouragement, and any high-level
> thoughts you might have about it.
I'm not sure it's *really* necessary to do this as a language extension,
rather than just as a library. Granted, there are nice aspects of doing
it as a language feature (you can use expressions in-place and they get
expanded as you'd expect), but given the choice, I think I'd rather see
something like printf. That could be done as a library-only addition,
and would make it fairly easy for folks to design a similar interface
with slightly-different syntax if they had different needs.
The specification also doesn't seem to say anything about the part that
I think is most important for format specifiers: formatting options. I/O
streams' manipulators are a pain to use, since they're verbose, and
unlike printf, they don't turn themselves off in most cases; hence why
Boost added I/O state savers. I'd much rather see a proposal that
improves format specifiers. However, I think a proposal for this would
end up looking more like printf's placeholder-style, since it seems
fairly difficult to add format specifiers to an in-place style (at
least, if you want to maintain readability).
- Jim
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
.
Author: Miro Knejp <miro.knejp@gmail.com>
Date: Sun, 20 Sep 2015 23:14:51 +0200
Raw View
> On 20 Sep 2015, at 22:58 , Jim Porter <jvp4846@g.rit.edu> wrote:
>=20
> On 9/18/2015 3:21 PM, Andrew Tomazos wrote:
>> Please find attached a very very rough draft of a proposal entitled
>> "Interpolated String Literals".
>>=20
>> Mainly after encouragement or discouragement, and any high-level
>> thoughts you might have about it.
>=20
> I'm not sure it's *really* necessary to do this as a language extension, =
rather than just as a library. Granted, there are nice aspects of doing it =
as a language feature (you can use expressions in-place and they get expand=
ed as you'd expect), but given the choice, I think I'd rather see something=
like printf. That could be done as a library-only addition, and would make=
it fairly easy for folks to design a similar interface with slightly-diffe=
rent syntax if they had different needs.
>=20
> The specification also doesn't seem to say anything about the part that I=
think is most important for format specifiers: formatting options. I/O str=
eams' manipulators are a pain to use, since they're verbose, and unlike pri=
ntf, they don't turn themselves off in most cases; hence why Boost added I/=
O state savers. I'd much rather see a proposal that improves format specifi=
ers. However, I think a proposal for this would end up looking more like pr=
intf's placeholder-style, since it seems fairly difficult to add format spe=
cifiers to an in-place style (at least, if you want to maintain readability=
).
If you need format specifiers or a runtime-provided format string then stri=
ng interpolation is not the tool you=E2=80=99re looking for. String interpo=
lation does not replace formatting and vice versa. String interpolation is =
used when the tokenization and formatting rules are determined at compile t=
ime, where it is a convenient syntax to replace a bunch of function or oper=
ator call boilerplate.
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
.
Author: Andrew Tomazos <andrewtomazos@gmail.com>
Date: Sun, 20 Sep 2015 23:21:35 +0200
Raw View
--f46d0418270c89f7d40520345924
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
On Sun, Sep 20, 2015 at 10:19 PM, Miro Knejp <miro.knejp@gmail.com> wrote:
>
> On 20 Sep 2015, at 15:01 , Andrew Tomazos <andrewtomazos@gmail.com> wrote=
:
>
> On Sat, Sep 19, 2015 at 12:33 PM, Bengt Gustafsson <
> bengt.gustafsson@beamways.com> wrote:
>
>> - Do we really need to be able to specify the introducer character. Can'=
t
>> % be fixed (with the usual %% escape possibility).
>>
>
> I considered that, but no matter what introducer you pick, there are
> always cases where the introducer is prevalent in the target string. Thi=
s
> occurs in natural language, but is especially the case of code generation=
,
> where you are generating strings for later compilation in C++ or some oth=
er
> programming language. Having the introducer be defined at the start also
> makes it easier to read, as you are reminded what the special token is
> (just like the compiler is).
>
> Compare:
>
> F"The result of %x %% %y is not zero (it is %(x%y))."
>
> with
>
> F"$ The result of $x % $y is not zero (it is $[x%y])."
>
> Similar problematic examples can be found with any set predefined
> introducer or set predefined brackets.
>
> The brackets are not a problem as they must be preceded by the introducin=
g
> character and contain a balanced token sequence, so the choice of bracket=
s
> does not matter.
>
I mean that if one type of bracket is prevalent in the non-interpolated
parts of the string, than a different type of bracket can be used in the
embedded expressions, to more easily distinguish them.
> I don=E2=80=99t really mind being able to chose the introducer, only that=
it is
> part of the string, meaning the compiler truncates my string! There is a
> lacking visual separation of data and metadata. I also think there should
> be a predefined sensible default introducer ($ makes sense as it is not a
> valid identifier character or operator in C++ code and its occurrence in
> natural language is rather rare as a currency symbol) which can be
> optionally overridden if needed.
>
I guess its use would be quite frequent in programs in the financial
sector, but more importantly many different languages use $, so when
generating code for them a different introducer should be chosen. For
example in shell:
std::system("ls $HOME");
or in regexs:
std::regex re("([a-z]+)\\.txt$");
As I said, similar arguments can be made for any given introducer, which is
why I have proposed it defined as part of the string, in the same way as
raw string literals.
>
> - Wouldn't it be more logical if this resulted in an expanded pack, i.e. =
a
>> number of comma separated parts.
>>
>
> format(std::cout, F"The number of %goods is %count");
>>
>
> No, I think:
>
> std::cout F"% The number of %goods is %count";
>
> is better.
>
> =E2=80=9Cbetter=E2=80=9D in what way? Does the syntax please you more or =
does it function
> better?
>
The implementation should follow from the design, not the other way around.
> But I am considering changing the definition of an interpolated string to
> be a function call expression of return type std::interpolated_string.
>
> This is a very strange limitation. By that logic all user defined literal=
s
> should return a std::udl_string, which I think people would agree is sill=
y.
>
You're confusing user-defined string literals with the built-in string
literals. Built-in string literals are expressions with a fixed type. My
proposal w.r.t std::interpolated_string is no different.
I haven't proposed user-defined interpolated string literals (I don't see
the use case / haven't got around to thinking about it), but if I did they
would be:
T operator""_foo (std::interpolated_string is);
So the expression:
F"$ blah blah $i blah"_foo
would have type T.
So why limit interpolated strings in that way? If the interpolated string
> is supposed to be sugar for transforming a sequence of expressions into
> one, then transforming it into a call to a user-defined function is the
> most flexible thing the proposal can provide. If F=E2=80=9D$ x + y =3D ${=
x + y}=E2=80=9D_foo
> (whatever the syntax may be) is translated to foo(=E2=80=9Cx + y =3D =E2=
=80=9C, x + y) then
> the type of the interpolated string is the result type of foo(). This is =
a
> very powerful mechanism that may not be limited to strings only, If peopl=
e
> want to capture arguments by reference they can decide to do so. Let the
> users decide how to process the interpolated string literal, just give th=
em
> the hooks into the compiler=E2=80=99s magic.
>
>
> This would mean we would have to write:
>
> std::cout << F"% The number of %goods is %count";
>
> (which some have requested anyway).
>
> But it also means we could also write:
>
> std::string s =3D F"% The number of %goods is %count";
>
> or use it anywhere you can use a string normally.
>
> std::interpolated_string would contain:
> 1. a reference to the constant expression format string and positions of
> embedded expressions (which are known at compile time)
> 2. references to the values of the evaluated embedded expressions for the
> current execution. (calculated at run-time usually, but it should be
> constexpr-compatible)
>
> You basically just described how to call a function.
>
By positions of the embedded expression I mean their begin/end character
positions in the string.
A rough sketch. The value of F"% The number of %goods is %count" produced
by the compile could look something like:
struct interpolated_string {
const char* format =3D "% The number of %goods is %count";
size_t end_introducer =3D 1;
size_t end_leading_whitespace =3D 2;
size_t embedded_expressions_begins[2] =3D { 16, 26 };
size_t embedded_expressions_ends[2] =3D { 20, 31 };
std::tuple<string, float> =3D {"apples", 42 };
}
The << operator or std::string converter would then use this raw
information to stream or concatenate the string into its final form.
>
>
> This means the operator<<(ostream&, interpolated_string) could be defined
> to stream out the substrings and subexpressions just like (and just as
> efficiently) as if you had written << for each.
>
> For the conversion from std::interpolated_string to std::string, it could
> use std::ostringstream internally or some more efficient method.
>
> So consumers of std::interpolated_strings could use operator<<(ostream&,
> std::interpolated_string), or use the conversion from
> std::interpolated_string to std::string implicitly (by just using
> std::string or std::string_view), or they could overload on
> std::interpolated_string.
>
> Users could also overload on std::interpolated_string to implement a
> translation mechanism, as they would have access to both the original
> source code text of the expressions as well as their evaluated values.
>
> std::interpolated_string would actually be a class template parametric on
> the types of the embedded expressions, but that's an implementation detai=
l.
>
> It is not an implementation detail because it is exposed in the interface
> of std::interpolated_string which impacts people=E2=80=99s function signa=
tures.
>
It only impacts peoples function signatures that write libraries to do
special things with interpolated strings. That is a very tiny fraction.
Most people would just use operator<<(ostream&, std::interpolated_string)
or the built-in conversion to std::string.
So if you write a function:
void f(const std::string& s);
then this will work out of the box:
f(F"% The number of %goods is %count")
and you don't need to know anything about the inards of
std::interpolated_string or how it works.
> I still don=E2=80=99t understand the purpose of this limitation. Who bene=
fits from
> std::interpolated_string? Why isn=E2=80=99t there a std::udl_string? If w=
e allow
> the interpolated literal to be converted to a user-defined function call =
it
> can return whatever the user needs. Add meaningful defaults to the standa=
rd
> library to cover the most common use cases, but leave the customization
> point open for advanced users. I believe it=E2=80=99s easier to specify t=
he
> behavior of =E2=80=9Csplit up this literal and call a function with these
> arguments=E2=80=9D compared to =E2=80=9Csplit up this literal, remember t=
he expression
> result references and pack them into a magic std type, which either needs
> to be a template or be type-erased=E2=80=9D.
>
> You've misunderstood what is being proposed I think. I hope I have
cleared it up.
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
--f46d0418270c89f7d40520345924
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><div class=3D"gmail_extra"><br><div class=3D"gmail_quo=
te">On Sun, Sep 20, 2015 at 10:19 PM, Miro Knejp <span dir=3D"ltr"><<a h=
ref=3D"mailto:miro.knejp@gmail.com" target=3D"_blank">miro.knejp@gmail.com<=
/a>></span> wrote:<br><blockquote class=3D"gmail_quote" style=3D"margin:=
0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);=
border-left-style:solid;padding-left:1ex"><div style=3D"word-wrap:break-wor=
d"><br><div><span class=3D""><blockquote type=3D"cite"><div>On 20 Sep 2015,=
at 15:01 , Andrew Tomazos <<a href=3D"mailto:andrewtomazos@gmail.com" t=
arget=3D"_blank">andrewtomazos@gmail.com</a>> wrote:</div><br><div><div =
dir=3D"ltr"><div class=3D"gmail_extra"><div class=3D"gmail_quote">On Sat, S=
ep 19, 2015 at 12:33 PM, Bengt Gustafsson <span dir=3D"ltr"><<a href=3D"=
mailto:bengt.gustafsson@beamways.com" target=3D"_blank">bengt.gustafsson@be=
amways.com</a>></span> wrote:<br><blockquote class=3D"gmail_quote" style=
=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(20=
4,204,204);border-left-style:solid;padding-left:1ex"><div dir=3D"ltr"><div>=
- Do we really need to be able to specify the introducer character. Can'=
;t % be fixed (with the usual %% escape possibility).</div></div></blockquo=
te><div><br></div><div>I considered that, but no matter what introducer you=
pick, there are always cases where the introducer is prevalent in the targ=
et string.=C2=A0 This occurs in natural language, but is especially the cas=
e of code generation, where you are generating strings for later compilatio=
n in C++ or some other programming language.=C2=A0 Having the introducer be=
defined at the start also makes it easier to read, as you are reminded wha=
t the special token is (just like the compiler is).</div><div><br></div><di=
v>Compare:</div><div><br></div><div>=C2=A0 =C2=A0F"The result of %x %%=
%y is not zero (it is %(x%y))."</div><div><br></div><div>with</div><d=
iv><br></div><div>=C2=A0 =C2=A0F"$ The result of $x % $y is not zero (=
it is $[x%y])."</div><div><br></div><div>Similar problematic examples =
can be found with any set predefined introducer or set predefined brackets.=
</div></div></div></div></div></blockquote></span>The brackets are not a pr=
oblem as they must be preceded by the introducing character and contain a b=
alanced token sequence, so the choice of brackets does not matter. </div></=
div></blockquote><div><br></div><div>I mean that if one type of bracket is =
prevalent in the non-interpolated parts of the string, than a different typ=
e of bracket can be used in the embedded expressions, to more easily distin=
guish them.</div><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=
=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(20=
4,204,204);border-left-style:solid;padding-left:1ex"><div style=3D"word-wra=
p:break-word"><div>I don=E2=80=99t really mind being able to chose the intr=
oducer, only that it is part of the string, meaning the compiler truncates =
my string! There is a lacking visual separation of data and metadata. I als=
o think there should be a predefined sensible default introducer ($ makes s=
ense as it is not a valid identifier character or operator in C++ code and =
its occurrence in natural language is rather rare as a currency symbol) whi=
ch can be optionally overridden if needed.</div></div></blockquote><div><br=
></div><div>I guess its use would be quite frequent in programs in the fina=
ncial sector, but more importantly many different languages use $, so when =
generating code for them a different introducer should be chosen.=C2=A0 For=
example in shell:</div><div><br></div><div><div>=C2=A0 std::system("l=
s $HOME");<br></div><div><br></div></div><div>or in regexs:</div><div>=
<br></div><div>=C2=A0 std::regex re("([a-z]+)\\.txt$");</div><div=
><br></div><div>As I said, similar arguments can be made for any given intr=
oducer, which is why I have proposed it defined as part of the string, in t=
he same way as raw string literals.</div><div><br></div><blockquote class=
=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;bo=
rder-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">=
<div style=3D"word-wrap:break-word"><div><span class=3D""><br><blockquote t=
ype=3D"cite"><div><div dir=3D"ltr"><div class=3D"gmail_extra"><div class=3D=
"gmail_quote"><div><br></div><blockquote class=3D"gmail_quote" style=3D"mar=
gin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,2=
04);border-left-style:solid;padding-left:1ex"><div dir=3D"ltr"><div></div><=
div>- Wouldn't it be more logical if this resulted in an expanded pack,=
i.e. a number of comma separated parts.</div></div></blockquote><div><br><=
/div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;bo=
rder-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:so=
lid;padding-left:1ex"><div dir=3D"ltr"><div>format(std::cout, F"The nu=
mber of %goods is %count");</div></div></blockquote><div><br></div><di=
v>No, I think:</div><div><br></div><div>=C2=A0 std::cout F"% The numbe=
r of %goods is %count";</div><div><br></div><div>is better.</div></div=
></div></div></div></blockquote></span>=E2=80=9Cbetter=E2=80=9D in what way=
? Does the syntax please you more or does it function better?</div></div></=
blockquote><div><br></div><div>The implementation should follow from the de=
sign, not the other way around.</div><div>=C2=A0<br></div><blockquote class=
=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;bo=
rder-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">=
<div style=3D"word-wrap:break-word"><div><span class=3D""><blockquote type=
=3D"cite"><div><div dir=3D"ltr"><div class=3D"gmail_extra"><div class=3D"gm=
ail_quote"><div>But I am considering changing the definition of an interpol=
ated string to be a function call expression of return type std::interpolat=
ed_string.<br></div></div></div></div></div></blockquote></span>This is a v=
ery strange limitation. By that logic all user defined literals should retu=
rn a std::udl_string, which I think people would agree is silly.</div></div=
></blockquote><div><br></div><div>You're confusing user-defined string =
literals with the built-in string literals.=C2=A0 Built-in string literals =
are expressions with a fixed type.=C2=A0 My proposal w.r.t std::interpolate=
d_string is no different.</div><div><br></div><div>I haven't proposed u=
ser-defined interpolated string literals (I don't see the use case / ha=
ven't got around to thinking about it), but if I did they would be:</di=
v><div><br></div><div>=C2=A0 =C2=A0T operator""_foo (std::interpo=
lated_string is);</div><div><br></div><div>So the expression:</div><div>=C2=
=A0</div><div>=C2=A0 =C2=A0F"$ blah blah $i blah"_foo</div><div><=
br></div><div>would have type T.</div><div><br></div><blockquote class=3D"g=
mail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-=
left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div =
style=3D"word-wrap:break-word"><div> So why limit interpolated strings in t=
hat way? If the interpolated string is supposed to be sugar for transformin=
g a sequence of expressions into one, then transforming it into a call to a=
user-defined function is the most flexible thing the proposal can provide.=
If F=E2=80=9D$ x + y =3D ${x + y}=E2=80=9D_foo (whatever the syntax may be=
) is translated to foo(=E2=80=9Cx + y =3D =E2=80=9C, x + y) then the type o=
f the interpolated string is the result type of foo(). This is a very power=
ful mechanism that may not be limited to strings only, If people want to ca=
pture arguments by reference they can decide to do so. Let the users decide=
how to process the interpolated string literal, just give them the hooks i=
nto the compiler=E2=80=99s magic.=C2=A0</div></div></blockquote><blockquote=
class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:=
1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left=
:1ex"><div style=3D"word-wrap:break-word"><div><span class=3D""><br><blockq=
uote type=3D"cite"><div><div dir=3D"ltr"><div class=3D"gmail_extra"><div cl=
ass=3D"gmail_quote"><div><br></div><div>This would mean we would have to wr=
ite:</div><div><br></div><div><div>=C2=A0 std::cout << F"% The n=
umber of %goods is %count";</div></div><div><br></div><div>(which some=
have requested anyway).</div><div><br></div><div>But it also means we coul=
d also write:</div><div><br></div><div>=C2=A0 std::string s =3D F"% Th=
e number of %goods is %count";</div><div><br></div><div>or use it anyw=
here you can use a string normally.</div><div><br></div><div>std::interpola=
ted_string would contain:<br></div><div>1. a reference to the constant expr=
ession format string and positions of embedded expressions (which are known=
at compile time)</div><div>2. references to the values of the evaluated em=
bedded expressions for the current execution. (calculated at run-time usual=
ly, but it should be constexpr-compatible)</div></div></div></div></div></b=
lockquote></span>You basically just described how to call a function.</div>=
</div></blockquote><div><br></div><div>By positions of the embedded express=
ion I mean their begin/end character positions in the string.</div><div><br=
></div><div>A rough sketch.=C2=A0 The value of F"% The number of %good=
s is %count" produced by the compile could look something like:</div><=
div><br></div><div>=C2=A0 struct interpolated_string {<br></div><div>=C2=A0=
=C2=A0 =C2=A0const char* format =3D "% The number of %goods is %count=
";</div><div>=C2=A0 =C2=A0 =C2=A0size_t end_introducer =3D 1;</div><di=
v>=C2=A0 =C2=A0 =C2=A0size_t end_leading_whitespace =3D 2;</div><div><div>=
=C2=A0 =C2=A0 =C2=A0size_t embedded_expressions_begins[2] =3D { 16, 26 };</=
div></div><div><div>=C2=A0 =C2=A0 =C2=A0size_t embedded_expressions_ends[2]=
=3D { 20, 31 };</div></div><div>=C2=A0 =C2=A0 =C2=A0std::tuple<string, =
float> =3D {"apples", 42 };</div><div>=C2=A0 }</div><div><br><=
/div><div>The << operator or std::string converter would then use thi=
s raw information to stream or concatenate the string into its final form.<=
/div><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0px=
0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);bor=
der-left-style:solid;padding-left:1ex"><div style=3D"word-wrap:break-word">=
<div><span class=3D""><br><blockquote type=3D"cite"><div><div dir=3D"ltr"><=
div class=3D"gmail_extra"><div class=3D"gmail_quote"><div><br></div><div>Th=
is means the operator<<(ostream&, interpolated_string) could be d=
efined to stream out the substrings and subexpressions just like (and just =
as efficiently) as if you had written << for each.</div><div><br></di=
v><div>For the conversion from std::interpolated_string to std::string, it =
could use std::ostringstream internally or some more efficient method.</div=
><div><br></div><div>So consumers of std::interpolated_strings could use op=
erator<<(ostream&, std::interpolated_string), or use the conversi=
on from std::interpolated_string to std::string implicitly (by just using s=
td::string or std::string_view), or they could overload on std::interpolate=
d_string.</div><div><br></div><div>Users could also overload on std::interp=
olated_string to implement a translation mechanism, as they would have acce=
ss to both the original source code text of the expressions as well as thei=
r evaluated values.</div><div><br></div><div>std::interpolated_string would=
actually be a class template parametric on the types of the embedded expre=
ssions, but that's an implementation detail.</div></div></div></div></d=
iv></blockquote></span>It is not an implementation detail because it is exp=
osed in the interface of std::interpolated_string which impacts people=E2=
=80=99s function signatures.</div></div></blockquote><div><br></div><div>It=
only impacts peoples function signatures that write libraries to do specia=
l things with interpolated strings.=C2=A0 That is a very tiny fraction.=C2=
=A0 Most people would just use operator<<(ostream&, std::interpol=
ated_string) or the built-in conversion to std::string.</div><div><br></div=
><div>So if you write a function:</div><div><br></div><div>=C2=A0 =C2=A0voi=
d f(const std::string& s);</div><div><br></div><div>then this will work=
out of the box:</div><div><br></div><div>=C2=A0 =C2=A0f(F"% The numbe=
r of %goods is %count")</div><div>=C2=A0</div><div>and you don't n=
eed to know anything about the inards of std::interpolated_string or how it=
works.</div><div><br></div><blockquote class=3D"gmail_quote" style=3D"marg=
in:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,20=
4);border-left-style:solid;padding-left:1ex"><div style=3D"word-wrap:break-=
word"><div><br>I still don=E2=80=99t understand the purpose of this limitat=
ion. Who benefits from std::interpolated_string? Why isn=E2=80=99t there a =
std::udl_string? If we allow the interpolated literal to be converted to a =
user-defined function call it can return whatever the user needs. Add meani=
ngful defaults to the standard library to cover the most common use cases, =
but leave the customization point open for advanced users. I believe it=E2=
=80=99s easier to specify the behavior of =E2=80=9Csplit up this literal an=
d call a function with these arguments=E2=80=9D compared to =E2=80=9Csplit =
up this literal, remember the expression result references and pack them in=
to a magic std type, which either needs to be a template or be type-erased=
=E2=80=9D.</div><div><br></div></div></blockquote><div>You've misunders=
tood what is being proposed I think.=C2=A0 I hope I have cleared it up.</di=
v><div>=C2=A0</div></div><br></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--f46d0418270c89f7d40520345924--
.
Author: Andrew Tomazos <andrewtomazos@gmail.com>
Date: Sun, 20 Sep 2015 23:43:32 +0200
Raw View
--047d7bb04db007c1ea052034a816
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
On Sun, Sep 20, 2015 at 11:14 PM, Miro Knejp <miro.knejp@gmail.com> wrote:
>
> > On 20 Sep 2015, at 22:58 , Jim Porter <jvp4846@g.rit.edu> wrote:
> >
> > On 9/18/2015 3:21 PM, Andrew Tomazos wrote:
> >> Please find attached a very very rough draft of a proposal entitled
> >> "Interpolated String Literals".
> >>
> >> Mainly after encouragement or discouragement, and any high-level
> >> thoughts you might have about it.
> >
> > I'm not sure it's *really* necessary to do this as a language extension=
,
> rather than just as a library. Granted, there are nice aspects of doing i=
t
> as a language feature (you can use expressions in-place and they get
> expanded as you'd expect), but given the choice, I think I'd rather see
> something like printf. That could be done as a library-only addition, and
> would make it fairly easy for folks to design a similar interface with
> slightly-different syntax if they had different needs.
> >
> > The specification also doesn't seem to say anything about the part that
> I think is most important for format specifiers: formatting options. I/O
> streams' manipulators are a pain to use, since they're verbose, and unlik=
e
> printf, they don't turn themselves off in most cases; hence why Boost add=
ed
> I/O state savers. I'd much rather see a proposal that improves format
> specifiers. However, I think a proposal for this would end up looking mor=
e
> like printf's placeholder-style, since it seems fairly difficult to add
> format specifiers to an in-place style (at least, if you want to maintain
> readability).
> If you need format specifiers or a runtime-provided format string then
> string interpolation is not the tool you=E2=80=99re looking for. String
> interpolation does not replace formatting and vice versa. String
> interpolation is used when the tokenization and formatting rules are
> determined at compile time, where it is a convenient syntax to replace a
> bunch of function or operator call boilerplate.
>
I'd like to add formatting to the proposal without damaging the major use
case (where expressions are interpolated with the default formatting for
their type), but I don't see a good way yet.
There is no good way to place embedded expressions in a string literal as
proposed, without core language changes.
The only current two categories of way to do this as a library feature is
is to either:
A. List the substrings and embedded expressions as separate expressions,
separated by a delimiter token:
print << "The number of " << goods << " is " << count << "."; // 1
print("The number of ", goods, " is ", count, "."); // 1
B. Put the expressions at the end:
print("% The number of % is %.", goods, count); // 2
print("% The number of %1 is %2.", goods, count); // 2
print("% The number of %goods is %count.", "goods", goods, "count",
count); // 3
Both categories are inferior to:
print(F"% The number of %goods is %count."); // 4
The reason 4 is superior to 1 is that it is far more readable. This is
because there is far less noise around the embedded expressions.
The reason 4 is superior to 2 is that the reader requires mental
indirections between the format string and the expression list. The reader
has to jump back and forth between them to understand what is going on.
With 4 the string can be read from left-to-right in one pass.
The reason 4 is superior to 3 is that in 3 the final map is redundant
information that clutters the code, requires maintenance, and isn't checked
by the compiler.
While the library solutions are not that bad, my claim is that the use case
is so extremely popular, that even a slightly better syntax for it
justifies a core solution. I claim 4 is significantly more readable than
the others.
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
--047d7bb04db007c1ea052034a816
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><div class=3D"gmail_extra"><br><div class=3D"gmail_quo=
te">On Sun, Sep 20, 2015 at 11:14 PM, Miro Knejp <span dir=3D"ltr"><<a h=
ref=3D"mailto:miro.knejp@gmail.com" target=3D"_blank">miro.knejp@gmail.com<=
/a>></span> wrote:<br><blockquote class=3D"gmail_quote" style=3D"margin:=
0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);=
border-left-style:solid;padding-left:1ex"><span class=3D""><br>
> On 20 Sep 2015, at 22:58 , Jim Porter <<a href=3D"mailto:jvp4846@g.=
rit.edu">jvp4846@g.rit.edu</a>> wrote:<br>
><br>
> On 9/18/2015 3:21 PM, Andrew Tomazos wrote:<br>
>> Please find attached a very very rough draft of a proposal entitle=
d<br>
>> "Interpolated String Literals".<br>
>><br>
>> Mainly after encouragement or discouragement, and any high-level<b=
r>
>> thoughts you might have about it.<br>
><br>
> I'm not sure it's *really* necessary to do this as a language =
extension, rather than just as a library. Granted, there are nice aspects o=
f doing it as a language feature (you can use expressions in-place and they=
get expanded as you'd expect), but given the choice, I think I'd r=
ather see something like printf. That could be done as a library-only addit=
ion, and would make it fairly easy for folks to design a similar interface =
with slightly-different syntax if they had different needs.<br>
><br>
> The specification also doesn't seem to say anything about the part=
that I think is most important for format specifiers: formatting options. =
I/O streams' manipulators are a pain to use, since they're verbose,=
and unlike printf, they don't turn themselves off in most cases; hence=
why Boost added I/O state savers. I'd much rather see a proposal that =
improves format specifiers. However, I think a proposal for this would end =
up looking more like printf's placeholder-style, since it seems fairly =
difficult to add format specifiers to an in-place style (at least, if you w=
ant to maintain readability).<br>
</span>If you need format specifiers or a runtime-provided format string th=
en string interpolation is not the tool you=E2=80=99re looking for. String =
interpolation does not replace formatting and vice versa. String interpolat=
ion is used when the tokenization and formatting rules are determined at co=
mpile time, where it is a convenient syntax to replace a bunch of function =
or operator call boilerplate.<br>
<div class=3D""><div class=3D"h5"></div></div></blockquote></div><br></div>=
<div class=3D"gmail_extra">I'd like to add formatting to the proposal w=
ithout damaging the major use case (where expressions are interpolated with=
the default formatting for their type), but I don't see a good way yet=
..</div><div class=3D"gmail_extra"><br></div><div class=3D"gmail_extra">Ther=
e is no good way to place embedded expressions in a string literal as propo=
sed, without core language changes.</div><div class=3D"gmail_extra"><br></d=
iv><div class=3D"gmail_extra">The only current two categories of way to do =
this as a library feature is is to either:</div><div class=3D"gmail_extra">=
<br></div><div class=3D"gmail_extra">A.=C2=A0 List the substrings and embed=
ded expressions as separate expressions, separated by a delimiter token:</d=
iv><div class=3D"gmail_extra"><br></div><div class=3D"gmail_extra">=C2=A0 =
=C2=A0print << "The number of " << goods << &qu=
ot; is " << count << "."; =C2=A0// 1</div><div c=
lass=3D"gmail_extra">=C2=A0 =C2=A0print("The number of ", goods, =
" is ", count, "."); =C2=A0// 1</div><div class=3D"gmai=
l_extra"><br></div><div class=3D"gmail_extra">B. Put the expressions at the=
end:</div><div class=3D"gmail_extra"><br></div><div class=3D"gmail_extra">=
<div class=3D"gmail_extra">=C2=A0 =C2=A0print("% The number of % is %.=
", goods, count); =C2=A0// 2</div><div><div class=3D"gmail_extra">=C2=
=A0 =C2=A0print("%=C2=A0The number of %1 is %2.", goods, count); =
// 2</div></div><div class=3D"gmail_extra">=C2=A0 =C2=A0print("%=C2=A0=
The number of %goods is %count.", "goods", goods, "coun=
t", count); // 3</div><div><br></div><div>Both categories are inferior=
to:</div><div><br></div></div><div class=3D"gmail_extra">=C2=A0 print(<spa=
n style=3D"font-size:12.8px">F"% The number of %goods is %count."=
); // 4</span></div><div class=3D"gmail_extra"><span style=3D"font-size:12.=
8px"><br></span></div><div class=3D"gmail_extra"><span style=3D"font-size:1=
2.8px">The reason 4 is superior to 1 is that it is far more readable.=C2=A0=
This is because there is far less noise around the embedded expressions.</=
span></div><div class=3D"gmail_extra"><span style=3D"font-size:12.8px"><br>=
</span></div><div class=3D"gmail_extra"><span style=3D"font-size:12.8px">Th=
e reason 4 is superior to 2 is that the reader requires mental indirections=
between the format string and the expression list.=C2=A0 The reader has to=
jump back and forth between them to understand what is going on.=C2=A0 Wit=
h 4 the string can be read from left-to-right in one pass.</span></div><div=
class=3D"gmail_extra"><span style=3D"font-size:12.8px"><br></span></div><d=
iv class=3D"gmail_extra"><span style=3D"font-size:12.8px">The reason 4 is s=
uperior to 3 is that in 3 the final map is redundant information that clutt=
ers the code, requires maintenance, and isn't checked by the compiler.<=
/span></div><div class=3D"gmail_extra"><span style=3D"font-size:12.8px"><br=
></span></div><div class=3D"gmail_extra"><span style=3D"font-size:12.8px">W=
hile the library solutions are not that bad, my claim is that the use case =
is so extremely popular, that even a slightly better syntax for it justifie=
s a core solution.=C2=A0 I claim 4 is significantly more readable than the =
others.</span></div><div class=3D"gmail_extra"><br></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--047d7bb04db007c1ea052034a816--
.
Author: jgottman6@gmail.com
Date: Sun, 20 Sep 2015 15:36:49 -0700 (PDT)
Raw View
------=_Part_3848_1158009187.1442788609443
Content-Type: multipart/alternative;
boundary="----=_Part_3849_672942374.1442788609443"
------=_Part_3849_672942374.1442788609443
Content-Type: text/plain; charset=UTF-8
One major problem with this is that it is only possible to interpolate
named variables, not arbitrary values. This means that it would be
impossible to interpolate an element of an array or the result of a
function call. I would prefer something like Ruby's #{ .. } interpolation
syntax, where you can do something like
a = 1
b = 2
puts "#{a} + #{b} = #{a + b}" # Prints "1 + 2 = 3"
Joe Gottman
On Friday, September 18, 2015 at 4:22:01 PM UTC-4, Andrew Tomazos wrote:
>
> Please find attached a very very rough draft of a proposal entitled
> "Interpolated String Literals".
>
> Mainly after encouragement or discouragement, and any high-level thoughts
> you might have about it.
>
>
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_3849_672942374.1442788609443
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">One major problem with this is that it is only possible to=
interpolate named variables, not arbitrary values.=C2=A0 This means that i=
t would be impossible to interpolate an element of an array or the result o=
f a function call.=C2=A0 I would prefer something like Ruby's #{ .. }=
=C2=A0 interpolation syntax, where you can do something like<br><br><div cl=
ass=3D"prettyprint" style=3D"background-color: rgb(250, 250, 250); border-c=
olor: rgb(187, 187, 187); border-style: solid; border-width: 1px; word-wrap=
: break-word;"><code class=3D"prettyprint"><div class=3D"subprettyprint"><s=
pan style=3D"color: #000;" class=3D"styled-by-prettify">a </span><span styl=
e=3D"color: #660;" class=3D"styled-by-prettify">=3D</span><span style=3D"co=
lor: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color: #066=
;" class=3D"styled-by-prettify">1</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"><br>b </span><span style=3D"color: #660;" class=3D"=
styled-by-prettify">=3D</span><span style=3D"color: #000;" class=3D"styled-=
by-prettify"> </span><span style=3D"color: #066;" class=3D"styled-by-pretti=
fy">2</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>p=
uts </span><span style=3D"color: #080;" class=3D"styled-by-prettify">"=
#{a} + #{b} =3D #{a + b}"</span><span style=3D"color: #000;" class=3D"=
styled-by-prettify"> </span><span style=3D"color: #800;" class=3D"styled-by=
-prettify"># Prints "1 + 2 =3D 3"</span><span style=3D"color: #00=
0;" class=3D"styled-by-prettify"><br></span></div></code></div><br><br>Joe =
Gottman<br><br>On Friday, September 18, 2015 at 4:22:01 PM UTC-4, Andrew To=
mazos wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-lef=
t: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr">P=
lease find attached a very very rough draft of a proposal entitled "In=
terpolated String Literals".<div><br></div><div>Mainly after encourage=
ment or discouragement, and any high-level thoughts you might have about it=
..</div><div><br></div></div>
</blockquote></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_3849_672942374.1442788609443--
------=_Part_3848_1158009187.1442788609443--
.
Author: Andrew Tomazos <andrewtomazos@gmail.com>
Date: Mon, 21 Sep 2015 00:44:29 +0200
Raw View
--f46d0418270cfc13890520358106
Content-Type: text/plain; charset=UTF-8
As proposed, you can. We call them embedded general expressions:
std::cout F"# #{a} + #{b} = #{a + b}";
// Prints "1 + 2 = 3"
As does:
std::cout F"# #a + #b = #{a + b}";
// Prints "1 + 2 = 3"
On Mon, Sep 21, 2015 at 12:36 AM, <jgottman6@gmail.com> wrote:
> One major problem with this is that it is only possible to interpolate
> named variables, not arbitrary values. This means that it would be
> impossible to interpolate an element of an array or the result of a
> function call. I would prefer something like Ruby's #{ .. } interpolation
> syntax, where you can do something like
>
> a = 1
> b = 2
> puts "#{a} + #{b} = #{a + b}" # Prints "1 + 2 = 3"
>
>
> Joe Gottman
>
> On Friday, September 18, 2015 at 4:22:01 PM UTC-4, Andrew Tomazos wrote:
>>
>> Please find attached a very very rough draft of a proposal entitled
>> "Interpolated String Literals".
>>
>> Mainly after encouragement or discouragement, and any high-level thoughts
>> you might have about it.
>>
>> --
>
> ---
> You received this message because you are subscribed to the Google Groups
> "ISO C++ Standard - Future Proposals" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to std-proposals+unsubscribe@isocpp.org.
> To post to this group, send email to std-proposals@isocpp.org.
> Visit this group at
> http://groups.google.com/a/isocpp.org/group/std-proposals/.
>
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
--f46d0418270cfc13890520358106
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">As proposed, you can.=C2=A0 We call them embedded general =
expressions:<div><br></div><div>=C2=A0 =C2=A0std::cout F"# #{a} + #{b}=
=3D #{a + b}";<br><div class=3D"gmail_extra">=C2=A0 =C2=A0//=C2=A0Pri=
nts "1 + 2 =3D 3"</div><div class=3D"gmail_extra"><br></div><div =
class=3D"gmail_extra">As does:</div><div class=3D"gmail_extra"><br></div><d=
iv class=3D"gmail_extra">=C2=A0 =C2=A0std::cout F"# #a + #b =3D #{a + =
b}";</div><div><div class=3D"gmail_extra">=C2=A0 =C2=A0//=C2=A0Prints =
"1 + 2 =3D 3"</div></div><div><br></div><div class=3D"gmail_extra=
"><br><div class=3D"gmail_quote">On Mon, Sep 21, 2015 at 12:36 AM, <span d=
ir=3D"ltr"><<a href=3D"mailto:jgottman6@gmail.com" target=3D"_blank">jgo=
ttman6@gmail.com</a>></span> wrote:<br><blockquote class=3D"gmail_quote"=
style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:=
rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir=3D"ltr"=
>One major problem with this is that it is only possible to interpolate nam=
ed variables, not arbitrary values.=C2=A0 This means that it would be impos=
sible to interpolate an element of an array or the result of a function cal=
l.=C2=A0 I would prefer something like Ruby's #{ .. }=C2=A0 interpolati=
on syntax, where you can do something like<br><br><div style=3D"border:1px =
solid rgb(187,187,187);word-wrap:break-word;background-color:rgb(250,250,25=
0)"><code><div><span style=3D"color:rgb(0,0,0)">a </span><span style=3D"col=
or:rgb(102,102,0)">=3D</span><span style=3D"color:rgb(0,0,0)"> </span><span=
style=3D"color:rgb(0,102,102)">1</span><span style=3D"color:rgb(0,0,0)"><b=
r>b </span><span style=3D"color:rgb(102,102,0)">=3D</span><span style=3D"co=
lor:rgb(0,0,0)"> </span><span style=3D"color:rgb(0,102,102)">2</span><span =
style=3D"color:rgb(0,0,0)"><br>puts </span><span style=3D"color:rgb(0,136,0=
)">"#{a} + #{b} =3D #{a + b}"</span><span style=3D"color:rgb(0,0,=
0)"> </span><span style=3D"color:rgb(136,0,0)"># Prints "1 + 2 =3D 3&q=
uot;</span><span style=3D"color:rgb(0,0,0)"><br></span></div></code></div><=
br><br>Joe Gottman<span class=3D""><br><br>On Friday, September 18, 2015 at=
4:22:01 PM UTC-4, Andrew Tomazos wrote:<blockquote class=3D"gmail_quote" s=
tyle=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rg=
b(204,204,204);border-left-style:solid;padding-left:1ex"><div dir=3D"ltr">P=
lease find attached a very very rough draft of a proposal entitled "In=
terpolated String Literals".<div><br></div><div>Mainly after encourage=
ment or discouragement, and any high-level thoughts you might have about it=
..</div><div><br></div></div>
</blockquote></span></div><div class=3D""><div class=3D"h5">
<p></p>
-- <br>
<br>
--- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org" target=3D"_=
blank">std-proposals+unsubscribe@isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br>
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/" target=3D"_blank">http://groups.google.com/a/isocpp.org/gro=
up/std-proposals/</a>.<br>
</div></div></blockquote></div><br></div></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--f46d0418270cfc13890520358106--
.
Author: Ville Voutilainen <ville.voutilainen@gmail.com>
Date: Mon, 21 Sep 2015 01:57:47 +0300
Raw View
On 20 September 2015 at 16:01, Andrew Tomazos <andrewtomazos@gmail.com> wrote:
> But I am considering changing the definition of an interpolated string to be
> a function call expression of return type std::interpolated_string.
+1.
> This would mean we would have to write:
> std::cout << F"% The number of %goods is %count";
> (which some have requested anyway).
Looks perfectly palatable to me. I find
std::cout F"% The number of %goods is %count";
very awkward in comparison.
> But it also means we could also write:
> std::string s = F"% The number of %goods is %count";
> or use it anywhere you can use a string normally.
+lots.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
.
Author: Jim Porter <jvp4846@g.rit.edu>
Date: Sun, 20 Sep 2015 19:01:01 -0500
Raw View
On 9/20/2015 4:14 PM, Miro Knejp wrote:
> If you need format specifiers or a runtime-provided format string
> then string interpolation is not the tool you=E2=80=99re looking for. Str=
ing
> interpolation does not replace formatting and vice versa. String
> interpolation is used when the tokenization and formatting rules are
> determined at compile time, where it is a convenient syntax to
> replace a bunch of function or operator call boilerplate.
I'm not sure I understand. It seems perfectly reasonable to me to have a=20
statically-defined format specifier like "print this number as=20
hexadecimal" or "pad this value to 8 characters". My concern is that I=20
can't think of a clean syntax for doing this *and* allowing in-place=20
expressions in the format string.
- Jim
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
.
Author: Jim Porter <jvp4846@g.rit.edu>
Date: Sun, 20 Sep 2015 19:27:16 -0500
Raw View
On 9/20/2015 4:43 PM, Andrew Tomazos wrote:
> I'd like to add formatting to the proposal without damaging the major
> use case (where expressions are interpolated with the default formatting
> for their type), but I don't see a good way yet.
For me, that makes this a non-starter, since my primary issue with I/O
streams is how verbose the manipulators are. As you say, there's about a
10-character overhead for default-formatted interpolations, but that's
nothing compared to the overhead for making a number use hexademical, or
changing floating point precision. If you're using these manipulators
inside functions, then it becomes quite painful to manage without
Boost's I/O state savers[1].
> Both categories are inferior to:
>
> print(F"% The number of %goods is %count."); // 4
>
[snip]
> While the library solutions are not that bad, my claim is that the use
> case is so extremely popular, that even a slightly better syntax for it
> justifies a core solution. I claim 4 is significantly more readable
> than the others.
I disagree that (4) is the most readable, except for very simple
examples. The closest I've seen to ideal (for my purposes) is how
str.format() works in Python. C++ can't support all the niceties that
str.format() has (unless named-arguments ever get added to C++), but
even without that, I think I'd prefer that style.
In my experience, the point when printing something out becomes a bother
is when I'm either a) printing the results of expressions (that I don't
want to add a local variable for), or b) when I need to print things
with non-default formatting. If neither of those are true, then using
the << operator is usually plenty readable to me, if slightly more
verbose than necessary.
For cases (a) and (b), I think Python-style format strings are the
easiest to follow; I can quickly see what each placeholder is (either by
index, or by name for complex format strings), and what it'll be
formatted like. I actually prefer the format string to *exclude* the
actual expressions that it interpolates over since it lets me ignore
them when I'm trying to figure out how I'd like a line of text to be
formatted.
There are other niceties to doing this as a library feature, since it
would be easy to pull format strings from, say, localization files.
While such a library feature might not be appropriate for everyone's
localization needs, it would probably be sufficient for
relatively-simple cases.
- Jim
[1] http://www.boost.org/doc/libs/1_55_0/libs/io/doc/ios_state.html
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
.
Author: Andrew Tomazos <andrewtomazos@gmail.com>
Date: Mon, 21 Sep 2015 04:55:40 +0200
Raw View
--047d7b874e504962a3052039042f
Content-Type: text/plain; charset=UTF-8
OK, here is what I have got for formatting:
Each embedded expression in an interpolated string literal, may optionally
have a positive integer associated with. To make such an association, the
index is placed between the introducer and the embedded expression, and
separated from the embedded expression by a colon:
F"$ The register is $reg in decimal, $1:reg in hex, and $2:reg in octal."
{std::hex, std::oct}
If any associated index appears in the interpolated string literal then:
1. Let us define M as the index with the highest integer value.
2. For each index between 1 and M, there must be at least one embedded
expression with that associated index. (There may be more than one)
3. A braced-init-list of length M shall follow the interpolated string
literal. It's contents are known as auxiliary expressions.
The associated indexes and values of these auxiliary expressions are stored
in the std::interpolated_string.
The operation of the standard library operator<<(ostream&,
std::interpolated_string), when interpolating an embedded expression with
an associated index is:
1. Save the state of the ostream
2. ostream << associated expression
3. ostream << the embedded expression
4. Restore the state of the ostream
The standard library conversion of std::interpolated_string to std::string
has the same effect (as if the string was interpolated with ostringstream).
The rationale of using an indexed system for the formatting information and
keeping it separate is that it is not an essential part of reading the
interpolated string literal. On a left-to-right pass of the interpolated
string literal you can get the essential information (the fixed substrings
and embedded expressions), and then the bulky and less interesting
auxillary information (the formatting details) are presented at the end.
Much the same way as we would present footnotes in a natural language
document.
On Mon, Sep 21, 2015 at 2:27 AM, Jim Porter <jvp4846@g.rit.edu> wrote:
> On 9/20/2015 4:43 PM, Andrew Tomazos wrote:
>
>> I'd like to add formatting to the proposal without damaging the major
>> use case (where expressions are interpolated with the default formatting
>> for their type), but I don't see a good way yet.
>>
>
> For me, that makes this a non-starter, since my primary issue with I/O
> streams is how verbose the manipulators are. As you say, there's about a
> 10-character overhead for default-formatted interpolations, but that's
> nothing compared to the overhead for making a number use hexademical, or
> changing floating point precision. If you're using these manipulators
> inside functions, then it becomes quite painful to manage without Boost's
> I/O state savers[1].
>
> Both categories are inferior to:
>>
>> print(F"% The number of %goods is %count."); // 4
>>
>> [snip]
>
>> While the library solutions are not that bad, my claim is that the use
>> case is so extremely popular, that even a slightly better syntax for it
>> justifies a core solution. I claim 4 is significantly more readable
>> than the others.
>>
>
> I disagree that (4) is the most readable, except for very simple examples.
> The closest I've seen to ideal (for my purposes) is how str.format() works
> in Python. C++ can't support all the niceties that str.format() has (unless
> named-arguments ever get added to C++), but even without that, I think I'd
> prefer that style.
>
> In my experience, the point when printing something out becomes a bother
> is when I'm either a) printing the results of expressions (that I don't
> want to add a local variable for), or b) when I need to print things with
> non-default formatting. If neither of those are true, then using the <<
> operator is usually plenty readable to me, if slightly more verbose than
> necessary.
>
> For cases (a) and (b), I think Python-style format strings are the easiest
> to follow; I can quickly see what each placeholder is (either by index, or
> by name for complex format strings), and what it'll be formatted like. I
> actually prefer the format string to *exclude* the actual expressions that
> it interpolates over since it lets me ignore them when I'm trying to figure
> out how I'd like a line of text to be formatted.
>
> There are other niceties to doing this as a library feature, since it
> would be easy to pull format strings from, say, localization files. While
> such a library feature might not be appropriate for everyone's localization
> needs, it would probably be sufficient for relatively-simple cases.
>
> - Jim
>
> [1] http://www.boost.org/doc/libs/1_55_0/libs/io/doc/ios_state.html
>
>
> --
>
> --- You received this message because you are subscribed to the Google
> Groups "ISO C++ Standard - Future Proposals" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to std-proposals+unsubscribe@isocpp.org.
> To post to this group, send email to std-proposals@isocpp.org.
> Visit this group at
> http://groups.google.com/a/isocpp.org/group/std-proposals/.
>
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
--047d7b874e504962a3052039042f
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">OK, here is what I have got for formatting:<div><br></div>=
<div>Each embedded expression in an interpolated string literal, may option=
ally have a positive integer associated with. To make such an association, =
the index is placed between the introducer and the embedded expression, and=
separated from the embedded expression by a colon:</div><div><br></div><di=
v>=C2=A0 F"$ The register is $reg in decimal, $1:reg in hex, and $2:re=
g in octal." {std::hex, std::oct}</div><div><br></div><div>If any asso=
ciated index appears in the interpolated string literal then:</div><div><br=
></div><div>1. Let us define M as the index with the highest integer value.=
</div><div><div class=3D"gmail_extra"><br></div><div class=3D"gmail_extra">=
2. For each index between 1 and M, there must be at least one embedded expr=
ession with that associated index. =C2=A0(There may be more than one)</div>=
<div class=3D"gmail_extra"><br></div><div class=3D"gmail_extra">3. A braced=
-init-list of length M shall follow the interpolated string literal.=C2=A0 =
It's contents are known as auxiliary expressions.</div><div class=3D"gm=
ail_extra"><br></div><div class=3D"gmail_extra">The associated indexes and =
values of these auxiliary expressions are stored in the std::interpolated_s=
tring.</div><div class=3D"gmail_extra"><br></div><div class=3D"gmail_extra"=
>The operation of the standard library operator<<(ostream&, std::=
interpolated_string), when interpolating an embedded expression with an ass=
ociated index is:</div><div class=3D"gmail_extra"><br></div><div class=3D"g=
mail_extra">1. Save the state of the ostream</div><div class=3D"gmail_extra=
">2. ostream << associated expression</div><div class=3D"gmail_extra"=
>3. ostream << the embedded expression</div><div class=3D"gmail_extra=
">4. Restore the state of the ostream</div><div class=3D"gmail_extra"><br><=
/div><div class=3D"gmail_extra">The standard library conversion of std::int=
erpolated_string to std::string has the same effect (as if the string was i=
nterpolated with ostringstream).</div><div class=3D"gmail_extra"><br></div>=
<div class=3D"gmail_extra">The rationale of using an indexed system for the=
formatting information and keeping it separate is that it is not an essent=
ial part of reading the interpolated string literal.=C2=A0 On a left-to-rig=
ht pass of the interpolated string literal you can get the essential inform=
ation (the fixed substrings and embedded expressions), and then the bulky a=
nd less interesting auxillary information (the formatting details) are pres=
ented at the end.=C2=A0 Much the same way as we would present footnotes in =
a natural language document.</div><div class=3D"gmail_extra"><br></div><div=
class=3D"gmail_extra"><div class=3D"gmail_quote">On Mon, Sep 21, 2015 at 2=
:27 AM, Jim Porter <span dir=3D"ltr"><<a href=3D"mailto:jvp4846@g.rit.ed=
u" target=3D"_blank">jvp4846@g.rit.edu</a>></span> wrote:<br><blockquote=
class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc soli=
d;padding-left:1ex"><span class=3D"">On 9/20/2015 4:43 PM, Andrew Tomazos w=
rote:<br>
<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex">
I'd like to add formatting to the proposal without damaging the major<b=
r>
use case (where expressions are interpolated with the default formatting<br=
>
for their type), but I don't see a good way yet.<br>
</blockquote>
<br></span>
For me, that makes this a non-starter, since my primary issue with I/O stre=
ams is how verbose the manipulators are. As you say, there's about a 10=
-character overhead for default-formatted interpolations, but that's no=
thing compared to the overhead for making a number use hexademical, or chan=
ging floating point precision. If you're using these manipulators insid=
e functions, then it becomes quite painful to manage without Boost's I/=
O state savers[1].<span class=3D""><br>
<br>
<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex">
Both categories are inferior to:<br>
<br>
=C2=A0 =C2=A0print(F"% The number of %goods is %count."); // 4<br=
>
<br>
</blockquote></span>
[snip]<span class=3D""><br>
<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex">
While the library solutions are not that bad, my claim is that the use<br>
case is so extremely popular, that even a slightly better syntax for it<br>
justifies a core solution.=C2=A0 I claim 4 is significantly more readable<b=
r>
than the others.<br>
</blockquote>
<br></span>
I disagree that (4) is the most readable, except for very simple examples. =
The closest I've seen to ideal (for my purposes) is how str.format() wo=
rks in Python. C++ can't support all the niceties that str.format() has=
(unless named-arguments ever get added to C++), but even without that, I t=
hink I'd prefer that style.<br>
<br>
In my experience, the point when printing something out becomes a bother is=
when I'm either a) printing the results of expressions (that I don'=
;t want to add a local variable for), or b) when I need to print things wit=
h non-default formatting. If neither of those are true, then using the <=
< operator is usually plenty readable to me, if slightly more verbose th=
an necessary.<br>
<br>
For cases (a) and (b), I think Python-style format strings are the easiest =
to follow; I can quickly see what each placeholder is (either by index, or =
by name for complex format strings), and what it'll be formatted like. =
I actually prefer the format string to *exclude* the actual expressions tha=
t it interpolates over since it lets me ignore them when I'm trying to =
figure out how I'd like a line of text to be formatted.<br>
<br>
There are other niceties to doing this as a library feature, since it would=
be easy to pull format strings from, say, localization files. While such a=
library feature might not be appropriate for everyone's localization n=
eeds, it would probably be sufficient for relatively-simple cases.<br>
<br>
- Jim<br>
<br>
[1] <a href=3D"http://www.boost.org/doc/libs/1_55_0/libs/io/doc/ios_state.h=
tml" rel=3D"noreferrer" target=3D"_blank">http://www.boost.org/doc/libs/1_5=
5_0/libs/io/doc/ios_state.html</a><div class=3D"HOEnZb"><div class=3D"h5"><=
br>
<br>
-- <br>
<br>
--- You received this message because you are subscribed to the Google Grou=
ps "ISO C++ Standard - Future Proposals" group.<br>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals%2Bunsubscribe@isocpp.org" target=3D=
"_blank">std-proposals+unsubscribe@isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br>
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/" rel=3D"noreferrer" target=3D"_blank">http://groups.google.c=
om/a/isocpp.org/group/std-proposals/</a>.<br>
</div></div></blockquote></div><br></div></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--047d7b874e504962a3052039042f--
.
Author: Bengt Gustafsson <bengt.gustafsson@beamways.com>
Date: Mon, 21 Sep 2015 05:42:21 -0700 (PDT)
Raw View
------=_Part_23_1541895753.1442839341643
Content-Type: multipart/alternative;
boundary="----=_Part_24_1245184767.1442839341643"
------=_Part_24_1245184767.1442839341643
Content-Type: text/plain; charset=UTF-8
>
>
> I must first say that I support the std::interpolated_string idea as it
> seems to allow both for high performance, conversion to std::string and
> translation. Good work!
>
To make the conversion to std::string the "tostring" functionality for the
types of the inserted data items must be called. Someone wrote that
ostringstream can be used. I suggest that a new function name should be
used, as a customization point. This allows more complex data types to be
inserted without relying on overloading <<.
This I believe also solves the formatting parameter issue as this
customizable formatter function can take an extra string_view containing
arbitrary formatting information in text form. To complement this a
delimiter character, maybe ; can be defined.
Here is a complete example:
F"The number of %goods is %(count;r4)"
The r4 part is formatting characters sent to:
string interpolate_tostring(int, const string_view& format)
which can maybe interpret it as right justifying the string in a four
character field. The interpretation is as far as the compiler knows
arbitrary although the default implementations of interpolate_tostring must
of course define
the options logically.
The interpolated_string type gets another size_t array or two to define how
to extract the formatting characters for each inserted value.
One worry: is by-value the best way of storing the inserted values? While
it is of course ok for simple types it can be expensive or impossible for
more complex types which may have interpolate_tostring (or operator<<)
defined. I think that const-reference is more logical, but it can be
dangerous especially if auto is used to capture
the interpolated_string object for later use, as the const-ref results of
embedded expressions may be destroyed by then. Better ideas?
Translation: To facilitate translation the entire format string including
the embedded expressions (as text) must be possible to extract from the
interpolated_string object to be used as a key into the string database (as
it is what gettext sees). The process of applying the translated string
(with possibly permuted insertions) requires some diligence but is doable
given some convention (outside the standard) of how to denote insert places
in the translated string. One possible convention is "don't touch it". With
that convention this would work:
std::string str = my::translate(F"The number of %goods is %(count;r4)");
The literal is translated to "Det finns %(count;z4) %goods" for the Swedish
edition. Note that the order has changed as well as the formatting info (z
could denote zero filled right aligned number).
std::interpolated_string<Ts...>
my::translate(std::interpolated_string<Ts...>& src) {
// Look up the translation of the literal
// copy the value tuple
// fix up the offset arrays. This can be done once and for all by the
translation machinery at dictionary load time.
return result;
}
This poses some restrictions on the possibility to create
std::interpolated_string objects yourself, but I don't think that will
cause any problems.
I'm not suggesting to standardize any particular translation machinery,
just that some preparations are done in the design.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_24_1245184767.1442839341643
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><blockquote class=3D"gmail_quote" style=3D"margin: 0;margi=
n-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"l=
tr"><br>I must first say that I support the std::interpolated_string idea a=
s it seems to allow both for high performance, conversion to std::string an=
d translation. Good work!</div></blockquote><div><br></div><div>To make the=
conversion to std::string the "tostring" functionality for the t=
ypes of the inserted data items must be called. Someone wrote that ostrings=
tream can be used. I suggest that a new function name should be used, as a =
customization point. This allows more complex data types to be inserted wit=
hout relying on overloading <<.</div><div><br></div><div>This I belie=
ve also solves the formatting parameter issue as this customizable formatte=
r function can take an extra string_view containing arbitrary formatting in=
formation in text form. To complement this a delimiter character, maybe ; c=
an be defined.</div><div><br></div><div>Here is a complete example:</div><d=
iv><br></div><div>F"The number of %goods is %(count;r4)"<br></div=
><div><br></div><div>The r4 part is formatting characters sent to:</div><di=
v><br></div><div>string interpolate_tostring(int, const string_view& fo=
rmat)</div><div><br></div><div>which can maybe interpret it as right justif=
ying the string in a four character field. The interpretation is as far as =
the compiler knows arbitrary although the default implementations of interp=
olate_tostring must of course define</div><div>the options logically.</div>=
<div><br></div><div>The interpolated_string type gets another size_t array =
or two to define how to extract the formatting characters for each inserted=
value.</div><div><br></div><div>One worry: is by-value the best way of sto=
ring the inserted values? While it is of course ok for simple types it can =
be expensive or impossible for more complex types which may have interpolat=
e_tostring (or operator<<) defined. I think that const-reference is m=
ore logical, but it can be dangerous especially if auto is used to capture =
the=C2=A0interpolated_string=C2=A0object for later use, as the const-ref re=
sults of embedded expressions may be destroyed by then. Better ideas?</div>=
<div><br></div><div>Translation: To facilitate translation the entire forma=
t string including the embedded expressions (as text) must be possible to e=
xtract from the interpolated_string object to be used as a key into the str=
ing database (as it is what gettext sees). The process of applying the tran=
slated string (with possibly permuted insertions) requires some diligence b=
ut is doable given some convention (outside the standard) of how to denote =
insert places in the translated string. One possible convention is "do=
n't touch it". With that convention this would work:</div><div><br=
></div><div><div>std::string str =3D my::translate(F"The number of %go=
ods is %(count;r4)");<br></div><div><br></div></div><div>The literal i=
s translated to "Det finns %(count;z4) %goods" for the Swedish ed=
ition. Note that the order has changed as well as the formatting info (z co=
uld denote zero filled right aligned number).</div><div><br></div><div>std:=
:interpolated_string<Ts...> my::translate(std::interpolated_string<=
;Ts...>& src) {</div><div>=C2=A0 =C2=A0 // Look up the translation o=
f the literal</div><div>=C2=A0 =C2=A0 // copy the value tuple</div><div>=C2=
=A0 =C2=A0 // fix up the offset arrays. This can be done once and for all b=
y the translation machinery at dictionary load time.</div><div>=C2=A0 =C2=
=A0 return result;</div><div>}</div><div><br></div><div>This poses some res=
trictions on the possibility to create std::interpolated_string objects you=
rself, but I don't think that will cause any problems.</div><div><br></=
div><div>I'm not suggesting to standardize any particular translation m=
achinery, just that some preparations are done in the design.</div><div><br=
></div><div><br></div><div><br></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_24_1245184767.1442839341643--
------=_Part_23_1541895753.1442839341643--
.
Author: Andrew Tomazos <andrewtomazos@gmail.com>
Date: Mon, 21 Sep 2015 17:09:44 +0200
Raw View
--047d7b624e9a7e5cfe0520434593
Content-Type: text/plain; charset=UTF-8
On Mon, Sep 21, 2015 at 2:42 PM, Bengt Gustafsson <
bengt.gustafsson@beamways.com> wrote:
>
>> I must first say that I support the std::interpolated_string idea as it
>> seems to allow both for high performance, conversion to std::string and
>> translation. Good work!
>>
>
> To make the conversion to std::string the "tostring" functionality for the
> types of the inserted data items must be called. Someone wrote that
> ostringstream can be used. I suggest that a new function name should be
> used, as a customization point. This allows more complex data types to be
> inserted without relying on overloading <<.
>
I don't follow this. The designer of a complex data type T provides an
operator<<(ostream&, T) as normal. This makes their type compatible with
both iostreams and interpolated strings.
Why would we invent a new function name? This would just mean the type
designer would have to write two functions for every class, instead of
one. It would also mean interpolated strings were not compatible with old
code that only defines operator<<. I don't see the gain.
This I believe also solves the formatting parameter issue as this
> customizable formatter function can take an extra string_view containing
> arbitrary formatting information in text form. To complement this a
> delimiter character, maybe ; can be defined.
>
> Here is a complete example:
>
> F"The number of %goods is %(count;r4)"
>
I considered and discarded the idea of having some special character
language to describe formatting (like printf). It is unreadable. It's
important that the formatting information use full words like in iostream,
but the custom formatting isn't essential to comprehension of the
interpolated string literal. Therefore (see my previous post) I am
proposing it be indexed and placed at the end.
The r4 part is formatting characters sent to:
>
> string interpolate_tostring(int, const string_view& format)
>
> which can maybe interpret it as right justifying the string in a four
> character field. The interpretation is as far as the compiler knows
> arbitrary although the default implementations of interpolate_tostring must
> of course define
> the options logically.
>
> The interpolated_string type gets another size_t array or two to define
> how to extract the formatting characters for each inserted value.
>
> One worry: is by-value the best way of storing the inserted values? While
> it is of course ok for simple types it can be expensive or impossible for
> more complex types which may have interpolate_tostring (or operator<<)
> defined. I think that const-reference is more logical, but it can be
> dangerous especially if auto is used to capture
> the interpolated_string object for later use, as the const-ref results of
> embedded expressions may be destroyed by then. Better ideas?
>
> Translation: To facilitate translation the entire format string including
> the embedded expressions (as text) must be possible to extract from the
> interpolated_string object to be used as a key into the string database (as
> it is what gettext sees). The process of applying the translated string
> (with possibly permuted insertions) requires some diligence but is doable
> given some convention (outside the standard) of how to denote insert places
> in the translated string. One possible convention is "don't touch it". With
> that convention this would work:
>
> std::string str = my::translate(F"The number of %goods is %(count;r4)");
>
> The literal is translated to "Det finns %(count;z4) %goods" for the
> Swedish edition. Note that the order has changed as well as the formatting
> info (z could denote zero filled right aligned number).
>
> std::interpolated_string<Ts...>
> my::translate(std::interpolated_string<Ts...>& src) {
> // Look up the translation of the literal
> // copy the value tuple
> // fix up the offset arrays. This can be done once and for all by the
> translation machinery at dictionary load time.
> return result;
> }
>
> This poses some restrictions on the possibility to create
> std::interpolated_string objects yourself, but I don't think that will
> cause any problems.
>
> I'm not suggesting to standardize any particular translation machinery,
> just that some preparations are done in the design.
>
>
>
> --
>
> ---
> You received this message because you are subscribed to the Google Groups
> "ISO C++ Standard - Future Proposals" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to std-proposals+unsubscribe@isocpp.org.
> To post to this group, send email to std-proposals@isocpp.org.
> Visit this group at
> http://groups.google.com/a/isocpp.org/group/std-proposals/.
>
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
--047d7b624e9a7e5cfe0520434593
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div class=3D"gmail_extra"><div class=3D"gmail_quote">On M=
on, Sep 21, 2015 at 2:42 PM, Bengt Gustafsson <span dir=3D"ltr"><<a href=
=3D"mailto:bengt.gustafsson@beamways.com" target=3D"_blank">bengt.gustafsso=
n@beamways.com</a>></span> wrote:<br><blockquote class=3D"gmail_quote" s=
tyle=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div=
dir=3D"ltr"><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-lef=
t:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><br>I=
must first say that I support the std::interpolated_string idea as it seem=
s to allow both for high performance, conversion to std::string and transla=
tion. Good work!</div></blockquote><div><br></div><div>To make the conversi=
on to std::string the "tostring" functionality for the types of t=
he inserted data items must be called. Someone wrote that ostringstream can=
be used. I suggest that a new function name should be used, as a customiza=
tion point. This allows more complex data types to be inserted without rely=
ing on overloading <<.</div></div></blockquote><div>=C2=A0</div><div>=
I don't follow this.=C2=A0 The designer of a complex data type T provid=
es an operator<<(ostream&, T) as normal.=C2=A0 This makes their t=
ype compatible with both iostreams and interpolated strings.</div><div><br>=
</div><div>Why would we invent a new function name?=C2=A0 This would just m=
ean the type designer would have to write two functions for every class, in=
stead of one.=C2=A0 It would also mean interpolated strings were not compat=
ible with old code that only defines operator<<.=C2=A0 I don't se=
e the gain.</div><div><br></div><blockquote class=3D"gmail_quote" style=3D"=
margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"=
ltr"><div></div><div>This I believe also solves the formatting parameter is=
sue as this customizable formatter function can take an extra string_view c=
ontaining arbitrary formatting information in text form. To complement this=
a delimiter character, maybe ; can be defined.</div><div><br></div><div>He=
re is a complete example:</div><div><br></div><div>F"The number of %go=
ods is %(count;r4)"</div></div></blockquote><div><br></div><div>I cons=
idered and discarded the idea of having some special character language to =
describe formatting (like printf).=C2=A0 It is unreadable.=C2=A0 It's i=
mportant that the formatting information use full words like in iostream, b=
ut the custom formatting isn't essential to comprehension of the interp=
olated string literal.=C2=A0 Therefore (see my previous post) I am proposin=
g it be indexed and placed at the end.</div><div><br></div><blockquote clas=
s=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;pad=
ding-left:1ex"><div dir=3D"ltr"><div></div><div>The r4 part is formatting c=
haracters sent to:</div><div><br></div><div>string interpolate_tostring(int=
, const string_view& format)</div><div><br></div><div>which can maybe i=
nterpret it as right justifying the string in a four character field. The i=
nterpretation is as far as the compiler knows arbitrary although the defaul=
t implementations of interpolate_tostring must of course define</div><div>t=
he options logically.</div><div><br></div><div>The interpolated_string type=
gets another size_t array or two to define how to extract the formatting c=
haracters for each inserted value.</div><div><br></div><div>One worry: is b=
y-value the best way of storing the inserted values? While it is of course =
ok for simple types it can be expensive or impossible for more complex type=
s which may have interpolate_tostring (or operator<<) defined. I thin=
k that const-reference is more logical, but it can be dangerous especially =
if auto is used to capture the=C2=A0interpolated_string=C2=A0object for lat=
er use, as the const-ref results of embedded expressions may be destroyed b=
y then. Better ideas?</div><div><br></div><div>Translation: To facilitate t=
ranslation the entire format string including the embedded expressions (as =
text) must be possible to extract from the interpolated_string object to be=
used as a key into the string database (as it is what gettext sees). The p=
rocess of applying the translated string (with possibly permuted insertions=
) requires some diligence but is doable given some convention (outside the =
standard) of how to denote insert places in the translated string. One poss=
ible convention is "don't touch it". With that convention thi=
s would work:</div><div><br></div><div><div>std::string str =3D my::transla=
te(F"The number of %goods is %(count;r4)");<br></div><div><br></d=
iv></div><div>The literal is translated to "Det finns %(count;z4) %goo=
ds" for the Swedish edition. Note that the order has changed as well a=
s the formatting info (z could denote zero filled right aligned number).</d=
iv><div><br></div><div>std::interpolated_string<Ts...> my::translate(=
std::interpolated_string<Ts...>& src) {</div><div>=C2=A0 =C2=A0 /=
/ Look up the translation of the literal</div><div>=C2=A0 =C2=A0 // copy th=
e value tuple</div><div>=C2=A0 =C2=A0 // fix up the offset arrays. This can=
be done once and for all by the translation machinery at dictionary load t=
ime.</div><div>=C2=A0 =C2=A0 return result;</div><div>}</div><div><br></div=
><div>This poses some restrictions on the possibility to create std::interp=
olated_string objects yourself, but I don't think that will cause any p=
roblems.</div><div><br></div><div>I'm not suggesting to standardize any=
particular translation machinery, just that some preparations are done in =
the design.</div><div><br></div><div><br></div><div><br></div></div><div cl=
ass=3D"HOEnZb"><div class=3D"h5">
<p></p>
-- <br>
<br>
--- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org" target=3D"_=
blank">std-proposals+unsubscribe@isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br>
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/" target=3D"_blank">http://groups.google.com/a/isocpp.org/gro=
up/std-proposals/</a>.<br>
</div></div></blockquote></div><br></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--047d7b624e9a7e5cfe0520434593--
.
Author: Tony V E <tvaneerd@gmail.com>
Date: Mon, 21 Sep 2015 12:11:45 -0400
Raw View
--001a11c223aa493cd50520442322
Content-Type: text/plain; charset=UTF-8
On Sun, Sep 20, 2015 at 10:55 PM, Andrew Tomazos <andrewtomazos@gmail.com>
wrote:
> OK, here is what I have got for formatting:
>
> Each embedded expression in an interpolated string literal, may optionally
> have a positive integer associated with. To make such an association, the
> index is placed between the introducer and the embedded expression, and
> separated from the embedded expression by a colon:
>
> F"$ The register is $reg in decimal, $1:reg in hex, and $2:reg in
> octal." {std::hex, std::oct}
>
F"$ The register is $reg in decimal, $hex(reg) in hex, and $octal(reg) in
octal."
where hex() and octal() are normal functions (either returning string or
some magic like a pair(format, value).
?
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
--001a11c223aa493cd50520442322
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><div class=3D"gmail_extra"><br><div class=3D"gmail_quo=
te">On Sun, Sep 20, 2015 at 10:55 PM, Andrew Tomazos <span dir=3D"ltr"><=
<a href=3D"mailto:andrewtomazos@gmail.com" target=3D"_blank">andrewtomazos@=
gmail.com</a>></span> wrote:<br><blockquote class=3D"gmail_quote" style=
=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding=
-left:1ex"><div dir=3D"ltr">OK, here is what I have got for formatting:<div=
><br></div><div>Each embedded expression in an interpolated string literal,=
may optionally have a positive integer associated with. To make such an as=
sociation, the index is placed between the introducer and the embedded expr=
ession, and separated from the embedded expression by a colon:</div><div><b=
r></div><div>=C2=A0 F"$ The register is $reg in decimal, $1:reg in hex=
, and $2:reg in octal." {std::hex, std::oct}</div></div></blockquote><=
div><br><br>F"$ The register is $reg in decimal, $hex(reg) in hex, and=
$octal(reg) in octal."<br><br></div><div>where hex() and octal() are =
normal functions (either returning string or some magic like a pair(format,=
value).<br>?<br></div><div><br></div><br></div><br></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--001a11c223aa493cd50520442322--
.
Author: Andrew Tomazos <andrewtomazos@gmail.com>
Date: Mon, 21 Sep 2015 21:08:20 +0200
Raw View
--047d7b874e50d671730520469a02
Content-Type: text/plain; charset=UTF-8
On Mon, Sep 21, 2015 at 6:11 PM, Tony V E <tvaneerd@gmail.com> wrote:
>
>
> On Sun, Sep 20, 2015 at 10:55 PM, Andrew Tomazos <andrewtomazos@gmail.com>
> wrote:
>
>> OK, here is what I have got for formatting:
>>
>> Each embedded expression in an interpolated string literal, may
>> optionally have a positive integer associated with. To make such an
>> association, the index is placed between the introducer and the embedded
>> expression, and separated from the embedded expression by a colon:
>>
>> F"$ The register is $reg in decimal, $1:reg in hex, and $2:reg in
>> octal." {std::hex, std::oct}
>>
>
>
> F"$ The register is $reg in decimal, $hex(reg) in hex, and $octal(reg) in
> octal."
>
> where hex() and octal() are normal functions (either returning string or
> some magic like a pair(format, value).
> ?
>
Assuming the existence of such functions you could write:
F"$ The register is $reg in decimal, ${hex(reg)} in hex, and ${octal(reg)}
in octal."
and this would work as proposed, however when the format specifiers get
longer and include precision, padding, showbase, etc, etc - their verbosity
begins to obfuscate the expression that they appertain to, hence why I
propose to provide a mechanism to index them as auxillary expressions and
place them at the back (like footnotes).
Also note they can repeat so:
std::cout << F"$ The registers are ($spi, $pc) in decimal, ($1:spi,
$1:pc) in hex, and ($2:spi, $2:pc) in octal." {std::hex, std::oct};
So the formatting information can be shared amongst multiple embedded
expressions. It is easy to see how this is useful.
There is also a performance issue with having the formatting inline as you
suggest. A function hex that takes a string and returns a string would
perform a heap allocation of the hex string and then as a second step
interpolate it into the interpolated string. By having the formatting
separate this enables iostreams (or other interpolated string consuming
libraries) to stream the data directly to hex, without the intermediate
value. This is the same concept as iostreams.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
--047d7b874e50d671730520469a02
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><div class=3D"gmail_extra"><br><div class=3D"gmail_quo=
te">On Mon, Sep 21, 2015 at 6:11 PM, Tony V E <span dir=3D"ltr"><<a href=
=3D"mailto:tvaneerd@gmail.com" target=3D"_blank">tvaneerd@gmail.com</a>>=
</span> wrote:<br><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px=
0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-=
left-style:solid;padding-left:1ex"><div dir=3D"ltr"><br><div class=3D"gmail=
_extra"><br><div class=3D"gmail_quote"><span class=3D"">On Sun, Sep 20, 201=
5 at 10:55 PM, Andrew Tomazos <span dir=3D"ltr"><<a href=3D"mailto:andre=
wtomazos@gmail.com" target=3D"_blank">andrewtomazos@gmail.com</a>></span=
> wrote:<br><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0=
..8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(20=
4,204,204);padding-left:1ex"><div dir=3D"ltr">OK, here is what I have got f=
or formatting:<div><br></div><div>Each embedded expression in an interpolat=
ed string literal, may optionally have a positive integer associated with. =
To make such an association, the index is placed between the introducer and=
the embedded expression, and separated from the embedded expression by a c=
olon:</div><div><br></div><div>=C2=A0 F"$ The register is $reg in deci=
mal, $1:reg in hex, and $2:reg in octal." {std::hex, std::oct}</div></=
div></blockquote></span><div><br><br>F"$ The register is $reg in decim=
al, $hex(reg) in hex, and $octal(reg) in octal."<br><br></div><div>whe=
re hex() and octal() are normal functions (either returning string or some =
magic like a pair(format, value).<br>?<br></div><div></div></div></div></di=
v></blockquote></div><br></div><div class=3D"gmail_extra">Assuming the exis=
tence of such functions you could write:</div><div class=3D"gmail_extra"><b=
r></div><div class=3D"gmail_extra">F"$ The register is $reg in decimal=
, ${hex(reg)} in hex, and ${octal(reg)} in octal."<br></div><div class=
=3D"gmail_extra"><br></div><div class=3D"gmail_extra">and this would work a=
s proposed, however when the format specifiers get longer and include preci=
sion, padding, showbase, etc, etc - their verbosity begins to obfuscate the=
expression that they appertain to, hence why I propose to provide a mechan=
ism to index them as auxillary expressions and place them at the back (like=
footnotes).</div><div class=3D"gmail_extra"><br></div><div class=3D"gmail_=
extra">Also note they can repeat so:</div><div class=3D"gmail_extra"><br></=
div><div class=3D"gmail_extra"><div class=3D"gmail_extra">=C2=A0 =C2=A0 std=
::cout << F"$ The registers are ($spi, $pc) in decimal, ($1:spi,=
$1:pc) in hex, and ($2:spi, $2:pc) in octal." {std::hex, std::oct};</=
div><div><br></div><div>So the formatting information can be shared amongst=
multiple embedded expressions.=C2=A0 It is easy to see how this is useful.=
</div><div><br></div><div>There is also a performance issue with having the=
formatting inline as you suggest.=C2=A0 A function hex that takes a string=
and returns a string would perform a heap allocation of the hex string and=
then as a second step interpolate it into the interpolated string.=C2=A0 B=
y having the formatting separate this enables iostreams (or other interpola=
ted string consuming libraries) to stream the data directly to hex, without=
the intermediate value.=C2=A0 This is the same concept as iostreams.</div>=
<div><br></div></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--047d7b874e50d671730520469a02--
.
Author: Bengt Gustafsson <bengt.gustafsson@beamways.com>
Date: Tue, 22 Sep 2015 00:18:19 -0700 (PDT)
Raw View
------=_Part_5785_357811371.1442906299354
Content-Type: multipart/alternative;
boundary="----=_Part_5786_107345631.1442906299354"
------=_Part_5786_107345631.1442906299354
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Ok, I was unclear there. The reason for the separate function name was to=
=20
be able to send the formatting string to it. You can't do that to a=20
operator.
Obviously formatting information must be cryptic (printf) or verbose=20
(cout), we can't have neither. My idea was more towards cryptic of course,=
=20
but it does not need to be as cryptic as printf...
The idea of destroying the flow of reading you created by introducing F""=
=20
in the first place by putting the formatting afterwards seems really=20
awkward to me. Then I like the idea of octal(x) or hex(x) better although I=
=20
wonder how it would scale to
multiple formatting commands. Also the std namespace gets a lot of new=20
names which could be used better, and some we would use like precision are=
=20
already used by ostream, aren't they? Or can they be reused maybe?
To preserve performance these functions would have to return some=20
descriptor object which I think is Tony's intention.
Personally I'm more for cryptic than verbose now that we have to choose. We=
=20
have all toiled to learn the strange details and shortcomings of the printf=
=20
formatting, by thinking a little before designing a new terse syntax I=20
think we can do much better. Here is a starting point from one project of=
=20
mine:
// d<decimals> Number of decimals for floating point numbers.
// p<precision> Precision for floating or int numbers.
// w<width> Min width in characters. Value is left aligned.
// r<width> Min width in characters. Value is right aligned.
// c<width> Min width in characters. Value is centered.
// z<width> Min width in characters. Value is right aligned and padded with=
=20
zeros on the left.
// t<sep> Use <sep> (one character) as the thousand separator, inserted=20
every third digit in front of the decimal char.
// ; Use decimal char from locale for floating point numbers.
// . Use dot as decimal char.
// , Use comma as decimal char.
// m<maxwidth> Max field width. I.e. width is treated as a minimum width=20
instead of a fixed width. m without a number is treated as an infinite=20
maximum width.
// f Prefer normal float formatting.
// e Force e format.
// a Show All decimals. This forces trailing zeros to be added until the=20
decimals or precision of a number is satisfied.
Den m=C3=A5ndag 21 september 2015 kl. 21:08:22 UTC+2 skrev Andrew Tomazos:
>
>
>
> On Mon, Sep 21, 2015 at 6:11 PM, Tony V E <tvan...@gmail.com <javascript:=
>
> > wrote:
>
>>
>>
>> On Sun, Sep 20, 2015 at 10:55 PM, Andrew Tomazos <andrew...@gmail.com=20
>> <javascript:>> wrote:
>>
>>> OK, here is what I have got for formatting:
>>>
>>> Each embedded expression in an interpolated string literal, may=20
>>> optionally have a positive integer associated with. To make such an=20
>>> association, the index is placed between the introducer and the embedde=
d=20
>>> expression, and separated from the embedded expression by a colon:
>>>
>>> F"$ The register is $reg in decimal, $1:reg in hex, and $2:reg in=20
>>> octal." {std::hex, std::oct}
>>>
>>
>>
>> F"$ The register is $reg in decimal, $hex(reg) in hex, and $octal(reg) i=
n=20
>> octal."
>>
>> where hex() and octal() are normal functions (either returning string or=
=20
>> some magic like a pair(format, value).
>> ?
>>
>
> Assuming the existence of such functions you could write:
>
> F"$ The register is $reg in decimal, ${hex(reg)} in hex, and ${octal(reg)=
}=20
> in octal."
>
> and this would work as proposed, however when the format specifiers get=
=20
> longer and include precision, padding, showbase, etc, etc - their verbosi=
ty=20
> begins to obfuscate the expression that they appertain to, hence why I=20
> propose to provide a mechanism to index them as auxillary expressions and=
=20
> place them at the back (like footnotes).
>
> Also note they can repeat so:
>
> std::cout << F"$ The registers are ($spi, $pc) in decimal, ($1:spi,=
=20
> $1:pc) in hex, and ($2:spi, $2:pc) in octal." {std::hex, std::oct};
>
> So the formatting information can be shared amongst multiple embedded=20
> expressions. It is easy to see how this is useful.
>
> There is also a performance issue with having the formatting inline as yo=
u=20
> suggest. A function hex that takes a string and returns a string would=
=20
> perform a heap allocation of the hex string and then as a second step=20
> interpolate it into the interpolated string. By having the formatting=20
> separate this enables iostreams (or other interpolated string consuming=
=20
> libraries) to stream the data directly to hex, without the intermediate=
=20
> value. This is the same concept as iostreams.
>
>
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
------=_Part_5786_107345631.1442906299354
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">Ok, I was unclear there. The reason for the separate funct=
ion name was to be able to send the formatting string to it. You can't =
do that to a operator.<div><br></div><div>Obviously formatting information =
must be cryptic (printf) or verbose (cout), we can't have neither. My i=
dea was more towards cryptic of course, but it does not need to be as crypt=
ic as printf...</div><div><br></div><div>The idea of destroying the flow of=
reading you created by introducing F"" in the first place by put=
ting the formatting afterwards seems really awkward to me. Then I like the =
idea of octal(x) or hex(x) better although I wonder how it would scale to</=
div><div>multiple formatting commands. Also the std namespace gets a lot of=
new names which could be used better, and some we would use like precision=
are already used by ostream, aren't they? Or can they be reused maybe?=
</div><div><br></div><div>To preserve performance these functions would hav=
e to return some descriptor object which I think is Tony's intention.</=
div><div><br></div><div>Personally I'm more for cryptic than verbose no=
w that we have to choose. We have all toiled to learn the strange details a=
nd shortcomings of the printf formatting, by thinking a little before desig=
ning a new terse syntax I think we can do much better. Here is a starting p=
oint from one project of mine:</div><div><br></div><div><div><span class=3D=
"Apple-tab-span" style=3D"white-space:pre"> </span>// d<decimals><sp=
an class=3D"Apple-tab-span" style=3D"white-space:pre"> </span>Number of d=
ecimals for floating point numbers.</div><div><span class=3D"Apple-tab-span=
" style=3D"white-space:pre"> </span>// p<precision><span class=3D"Ap=
ple-tab-span" style=3D"white-space:pre"> </span>Precision for floating or=
int numbers.</div><div><span class=3D"Apple-tab-span" style=3D"white-space=
:pre"> </span>// w<width><span class=3D"Apple-tab-span" style=3D"whi=
te-space:pre"> </span>Min width in characters. Value is left aligned.</d=
iv><div><span class=3D"Apple-tab-span" style=3D"white-space:pre"> </span>/=
/ r<width><span class=3D"Apple-tab-span" style=3D"white-space:pre"> =
</span>Min width in characters. Value is right aligned.</div><div><span c=
lass=3D"Apple-tab-span" style=3D"white-space:pre"> </span>// c<width>=
;<span class=3D"Apple-tab-span" style=3D"white-space:pre"> </span>Min wi=
dth in characters. Value is centered.</div><div><span class=3D"Apple-tab-sp=
an" style=3D"white-space:pre"> </span>// z<width><span class=3D"Appl=
e-tab-span" style=3D"white-space:pre"> </span>Min width in characters. V=
alue is right aligned and padded with zeros on the left.</div><div><span cl=
ass=3D"Apple-tab-span" style=3D"white-space:pre"> </span>// t<sep><s=
pan class=3D"Apple-tab-span" style=3D"white-space:pre"> </span>Use <s=
ep> (one character) as the thousand separator, inserted every third digi=
t in front of the decimal char.</div><div><span class=3D"Apple-tab-span" st=
yle=3D"white-space:pre"> </span>// ;<span class=3D"Apple-tab-span" style=
=3D"white-space:pre"> </span>Use decimal char from locale for floating =
point numbers.</div><div><span class=3D"Apple-tab-span" style=3D"white-spac=
e:pre"> </span>// .<span class=3D"Apple-tab-span" style=3D"white-space:pre=
"> </span>Use dot as decimal char.</div><div><span class=3D"Apple-tab-s=
pan" style=3D"white-space:pre"> </span>// ,<span class=3D"Apple-tab-span" =
style=3D"white-space:pre"> </span>Use comma as decimal char.</div><div>=
<span class=3D"Apple-tab-span" style=3D"white-space:pre"> </span>// m<m=
axwidth><span class=3D"Apple-tab-span" style=3D"white-space:pre"> </sp=
an>Max field width. I.e. width is treated as a minimum width instead of a f=
ixed width. m without a number is treated as an infinite maximum width.</di=
v><div><span class=3D"Apple-tab-span" style=3D"white-space:pre"> </span>//=
f<span class=3D"Apple-tab-span" style=3D"white-space:pre"> </span>Pref=
er normal float formatting.</div><div><span class=3D"Apple-tab-span" style=
=3D"white-space:pre"> </span>// e<span class=3D"Apple-tab-span" style=3D"w=
hite-space:pre"> </span>Force e format.</div><div><span class=3D"Apple-=
tab-span" style=3D"white-space:pre"> </span>// a<span class=3D"Apple-tab-s=
pan" style=3D"white-space:pre"> </span>Show All decimals. This forces t=
railing zeros to be added until the decimals or precision of a number is sa=
tisfied.</div><div><br></div></div><div><br></div><div><br>Den m=C3=A5ndag =
21 september 2015 kl. 21:08:22 UTC+2 skrev Andrew Tomazos:<blockquote class=
=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #cc=
c solid;padding-left: 1ex;"><div dir=3D"ltr"><br><div><br><div class=3D"gma=
il_quote">On Mon, Sep 21, 2015 at 6:11 PM, Tony V E <span dir=3D"ltr"><<=
a href=3D"javascript:" target=3D"_blank" gdf-obfuscated-mailto=3D"s5HhoHLPB=
QAJ" rel=3D"nofollow" onmousedown=3D"this.href=3D'javascript:';retu=
rn true;" onclick=3D"this.href=3D'javascript:';return true;">tvan..=
..@gmail.com</a>></span> wrote:<br><blockquote class=3D"gmail_quote" styl=
e=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(2=
04,204,204);border-left-style:solid;padding-left:1ex"><div dir=3D"ltr"><br>=
<div><br><div class=3D"gmail_quote"><span>On Sun, Sep 20, 2015 at 10:55 PM,=
Andrew Tomazos <span dir=3D"ltr"><<a href=3D"javascript:" target=3D"_bl=
ank" gdf-obfuscated-mailto=3D"s5HhoHLPBQAJ" rel=3D"nofollow" onmousedown=3D=
"this.href=3D'javascript:';return true;" onclick=3D"this.href=3D=
9;javascript:';return true;">andrew...@gmail.com</a>></span> wrote:<=
br><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;bord=
er-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204=
);padding-left:1ex"><div dir=3D"ltr">OK, here is what I have got for format=
ting:<div><br></div><div>Each embedded expression in an interpolated string=
literal, may optionally have a positive integer associated with. To make s=
uch an association, the index is placed between the introducer and the embe=
dded expression, and separated from the embedded expression by a colon:</di=
v><div><br></div><div>=C2=A0 F"$ The register is $reg in decimal, $1:r=
eg in hex, and $2:reg in octal." {std::hex, std::oct}</div></div></blo=
ckquote></span><div><br><br>F"$ The register is $reg in decimal, $hex(=
reg) in hex, and $octal(reg) in octal."<br><br></div><div>where hex() =
and octal() are normal functions (either returning string or some magic lik=
e a pair(format, value).<br>?<br></div><div></div></div></div></div></block=
quote></div><br></div><div>Assuming the existence of such functions you cou=
ld write:</div><div><br></div><div>F"$ The register is $reg in decimal=
, ${hex(reg)} in hex, and ${octal(reg)} in octal."<br></div><div><br><=
/div><div>and this would work as proposed, however when the format specifie=
rs get longer and include precision, padding, showbase, etc, etc - their ve=
rbosity begins to obfuscate the expression that they appertain to, hence wh=
y I propose to provide a mechanism to index them as auxillary expressions a=
nd place them at the back (like footnotes).</div><div><br></div><div>Also n=
ote they can repeat so:</div><div><br></div><div><div>=C2=A0 =C2=A0 std::co=
ut << F"$ The registers are ($spi, $pc) in decimal, ($1:spi, $1:=
pc) in hex, and ($2:spi, $2:pc) in octal." {std::hex, std::oct};</div>=
<div><br></div><div>So the formatting information can be shared amongst mul=
tiple embedded expressions.=C2=A0 It is easy to see how this is useful.</di=
v><div><br></div><div>There is also a performance issue with having the for=
matting inline as you suggest.=C2=A0 A function hex that takes a string and=
returns a string would perform a heap allocation of the hex string and the=
n as a second step interpolate it into the interpolated string.=C2=A0 By ha=
ving the formatting separate this enables iostreams (or other interpolated =
string consuming libraries) to stream the data directly to hex, without the=
intermediate value.=C2=A0 This is the same concept as iostreams.</div><div=
><br></div></div></div>
</blockquote></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_5786_107345631.1442906299354--
------=_Part_5785_357811371.1442906299354--
.
Author: Bengt Gustafsson <bengt.gustafsson@beamways.com>
Date: Sat, 26 Sep 2015 07:34:12 -0700 (PDT)
Raw View
------=_Part_665_245841195.1443278052270
Content-Type: multipart/alternative;
boundary="----=_Part_666_1906696658.1443278052271"
------=_Part_666_1906696658.1443278052271
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
In addition: By providing the formatting as part of the string rather than=
=20
the embedded expressions translation gets a chance to change the formatting=
=20
details. Using functions like octal(x) prevents this from being done=20
without changing the source code.
Den tisdag 22 september 2015 kl. 09:18:19 UTC+2 skrev Bengt Gustafsson:
>
> Ok, I was unclear there. The reason for the separate function name was to=
=20
> be able to send the formatting string to it. You can't do that to a=20
> operator.
>
> Obviously formatting information must be cryptic (printf) or verbose=20
> (cout), we can't have neither. My idea was more towards cryptic of course=
,=20
> but it does not need to be as cryptic as printf...
>
> The idea of destroying the flow of reading you created by introducing F""=
=20
> in the first place by putting the formatting afterwards seems really=20
> awkward to me. Then I like the idea of octal(x) or hex(x) better although=
I=20
> wonder how it would scale to
> multiple formatting commands. Also the std namespace gets a lot of new=20
> names which could be used better, and some we would use like precision ar=
e=20
> already used by ostream, aren't they? Or can they be reused maybe?
>
> To preserve performance these functions would have to return some=20
> descriptor object which I think is Tony's intention.
>
> Personally I'm more for cryptic than verbose now that we have to choose.=
=20
> We have all toiled to learn the strange details and shortcomings of the=
=20
> printf formatting, by thinking a little before designing a new terse synt=
ax=20
> I think we can do much better. Here is a starting point from one project =
of=20
> mine:
>
> // d<decimals> Number of decimals for floating point numbers.
> // p<precision> Precision for floating or int numbers.
> // w<width> Min width in characters. Value is left aligned.
> // r<width> Min width in characters. Value is right aligned.
> // c<width> Min width in characters. Value is centered.
> // z<width> Min width in characters. Value is right aligned and padded=20
> with zeros on the left.
> // t<sep> Use <sep> (one character) as the thousand separator, inserted=
=20
> every third digit in front of the decimal char.
> // ; Use decimal char from locale for floating point numbers.
> // . Use dot as decimal char.
> // , Use comma as decimal char.
> // m<maxwidth> Max field width. I.e. width is treated as a minimum width=
=20
> instead of a fixed width. m without a number is treated as an infinite=20
> maximum width.
> // f Prefer normal float formatting.
> // e Force e format.
> // a Show All decimals. This forces trailing zeros to be added until the=
=20
> decimals or precision of a number is satisfied.
>
>
>
> Den m=C3=A5ndag 21 september 2015 kl. 21:08:22 UTC+2 skrev Andrew Tomazos=
:
>>
>>
>>
>> On Mon, Sep 21, 2015 at 6:11 PM, Tony V E <tvan...@gmail.com> wrote:
>>
>>>
>>>
>>> On Sun, Sep 20, 2015 at 10:55 PM, Andrew Tomazos <andrew...@gmail.com>=
=20
>>> wrote:
>>>
>>>> OK, here is what I have got for formatting:
>>>>
>>>> Each embedded expression in an interpolated string literal, may=20
>>>> optionally have a positive integer associated with. To make such an=20
>>>> association, the index is placed between the introducer and the embedd=
ed=20
>>>> expression, and separated from the embedded expression by a colon:
>>>>
>>>> F"$ The register is $reg in decimal, $1:reg in hex, and $2:reg in=20
>>>> octal." {std::hex, std::oct}
>>>>
>>>
>>>
>>> F"$ The register is $reg in decimal, $hex(reg) in hex, and $octal(reg)=
=20
>>> in octal."
>>>
>>> where hex() and octal() are normal functions (either returning string o=
r=20
>>> some magic like a pair(format, value).
>>> ?
>>>
>>
>> Assuming the existence of such functions you could write:
>>
>> F"$ The register is $reg in decimal, ${hex(reg)} in hex, and=20
>> ${octal(reg)} in octal."
>>
>> and this would work as proposed, however when the format specifiers get=
=20
>> longer and include precision, padding, showbase, etc, etc - their verbos=
ity=20
>> begins to obfuscate the expression that they appertain to, hence why I=
=20
>> propose to provide a mechanism to index them as auxillary expressions an=
d=20
>> place them at the back (like footnotes).
>>
>> Also note they can repeat so:
>>
>> std::cout << F"$ The registers are ($spi, $pc) in decimal, ($1:spi,=
=20
>> $1:pc) in hex, and ($2:spi, $2:pc) in octal." {std::hex, std::oct};
>>
>> So the formatting information can be shared amongst multiple embedded=20
>> expressions. It is easy to see how this is useful.
>>
>> There is also a performance issue with having the formatting inline as=
=20
>> you suggest. A function hex that takes a string and returns a string wo=
uld=20
>> perform a heap allocation of the hex string and then as a second step=20
>> interpolate it into the interpolated string. By having the formatting=
=20
>> separate this enables iostreams (or other interpolated string consuming=
=20
>> libraries) to stream the data directly to hex, without the intermediate=
=20
>> value. This is the same concept as iostreams.
>>
>>
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
------=_Part_666_1906696658.1443278052271
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">In addition: By providing the formatting as part of the st=
ring rather than the embedded expressions translation gets a chance to chan=
ge the formatting details. Using functions like octal(x) prevents this from=
being done without changing the source code.<div><br><br>Den tisdag 22 sep=
tember 2015 kl. 09:18:19 UTC+2 skrev Bengt Gustafsson:<blockquote class=3D"=
gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc so=
lid;padding-left: 1ex;"><div dir=3D"ltr">Ok, I was unclear there. The reaso=
n for the separate function name was to be able to send the formatting stri=
ng to it. You can't do that to a operator.<div><br></div><div>Obviously=
formatting information must be cryptic (printf) or verbose (cout), we can&=
#39;t have neither. My idea was more towards cryptic of course, but it does=
not need to be as cryptic as printf...</div><div><br></div><div>The idea o=
f destroying the flow of reading you created by introducing F"" i=
n the first place by putting the formatting afterwards seems really awkward=
to me. Then I like the idea of octal(x) or hex(x) better although I wonder=
how it would scale to</div><div>multiple formatting commands. Also the std=
namespace gets a lot of new names which could be used better, and some we =
would use like precision are already used by ostream, aren't they? Or c=
an they be reused maybe?</div><div><br></div><div>To preserve performance t=
hese functions would have to return some descriptor object which I think is=
Tony's intention.</div><div><br></div><div>Personally I'm more for=
cryptic than verbose now that we have to choose. We have all toiled to lea=
rn the strange details and shortcomings of the printf formatting, by thinki=
ng a little before designing a new terse syntax I think we can do much bett=
er. Here is a starting point from one project of mine:</div><div><br></div>=
<div><div><span style=3D"white-space:pre"> </span>// d<decimals><spa=
n style=3D"white-space:pre"> </span>Number of decimals for floating point=
numbers.</div><div><span style=3D"white-space:pre"> </span>// p<precis=
ion><span style=3D"white-space:pre"> </span>Precision for floating or =
int numbers.</div><div><span style=3D"white-space:pre"> </span>// w<wid=
th><span style=3D"white-space:pre"> </span>Min width in characters. V=
alue is left aligned.</div><div><span style=3D"white-space:pre"> </span>//=
r<width><span style=3D"white-space:pre"> </span>Min width in char=
acters. Value is right aligned.</div><div><span style=3D"white-space:pre"> =
</span>// c<width><span style=3D"white-space:pre"> </span>Min wid=
th in characters. Value is centered.</div><div><span style=3D"white-space:p=
re"> </span>// z<width><span style=3D"white-space:pre"> </span>Mi=
n width in characters. Value is right aligned and padded with zeros on the =
left.</div><div><span style=3D"white-space:pre"> </span>// t<sep><sp=
an style=3D"white-space:pre"> </span>Use <sep> (one character) as =
the thousand separator, inserted every third digit in front of the decimal =
char.</div><div><span style=3D"white-space:pre"> </span>// ;<span style=3D=
"white-space:pre"> </span>Use decimal char from locale for floating poi=
nt numbers.</div><div><span style=3D"white-space:pre"> </span>// .<span st=
yle=3D"white-space:pre"> </span>Use dot as decimal char.</div><div><spa=
n style=3D"white-space:pre"> </span>// ,<span style=3D"white-space:pre"> =
</span>Use comma as decimal char.</div><div><span style=3D"white-space:p=
re"> </span>// m<maxwidth><span style=3D"white-space:pre"> </span>=
Max field width. I.e. width is treated as a minimum width instead of a fixe=
d width. m without a number is treated as an infinite maximum width.</div><=
div><span style=3D"white-space:pre"> </span>// f<span style=3D"white-space=
:pre"> </span>Prefer normal float formatting.</div><div><span style=3D"=
white-space:pre"> </span>// e<span style=3D"white-space:pre"> </span>F=
orce e format.</div><div><span style=3D"white-space:pre"> </span>// a<span=
style=3D"white-space:pre"> </span>Show All decimals. This forces trail=
ing zeros to be added until the decimals or precision of a number is satisf=
ied.</div><div><br></div></div><div><br></div><div><br>Den m=C3=A5ndag 21 s=
eptember 2015 kl. 21:08:22 UTC+2 skrev Andrew Tomazos:<blockquote class=3D"=
gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid=
;padding-left:1ex"><div dir=3D"ltr"><br><div><br><div class=3D"gmail_quote"=
>On Mon, Sep 21, 2015 at 6:11 PM, Tony V E <span dir=3D"ltr"><<a rel=3D"=
nofollow">tvan...@gmail.com</a>></span> wrote:<br><blockquote class=3D"g=
mail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-=
left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div =
dir=3D"ltr"><br><div><br><div class=3D"gmail_quote"><span>On Sun, Sep 20, 2=
015 at 10:55 PM, Andrew Tomazos <span dir=3D"ltr"><<a rel=3D"nofollow">a=
ndrew...@gmail.com</a>></span> wrote:<br><blockquote class=3D"gmail_quot=
e" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-styl=
e:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div dir=3D"lt=
r">OK, here is what I have got for formatting:<div><br></div><div>Each embe=
dded expression in an interpolated string literal, may optionally have a po=
sitive integer associated with. To make such an association, the index is p=
laced between the introducer and the embedded expression, and separated fro=
m the embedded expression by a colon:</div><div><br></div><div>=C2=A0 F&quo=
t;$ The register is $reg in decimal, $1:reg in hex, and $2:reg in octal.&qu=
ot; {std::hex, std::oct}</div></div></blockquote></span><div><br><br>F"=
;$ The register is $reg in decimal, $hex(reg) in hex, and $octal(reg) in oc=
tal."<br><br></div><div>where hex() and octal() are normal functions (=
either returning string or some magic like a pair(format, value).<br>?<br><=
/div><div></div></div></div></div></blockquote></div><br></div><div>Assumin=
g the existence of such functions you could write:</div><div><br></div><div=
>F"$ The register is $reg in decimal, ${hex(reg)} in hex, and ${octal(=
reg)} in octal."<br></div><div><br></div><div>and this would work as p=
roposed, however when the format specifiers get longer and include precisio=
n, padding, showbase, etc, etc - their verbosity begins to obfuscate the ex=
pression that they appertain to, hence why I propose to provide a mechanism=
to index them as auxillary expressions and place them at the back (like fo=
otnotes).</div><div><br></div><div>Also note they can repeat so:</div><div>=
<br></div><div><div>=C2=A0 =C2=A0 std::cout << F"$ The registers=
are ($spi, $pc) in decimal, ($1:spi, $1:pc) in hex, and ($2:spi, $2:pc) in=
octal." {std::hex, std::oct};</div><div><br></div><div>So the formatt=
ing information can be shared amongst multiple embedded expressions.=C2=A0 =
It is easy to see how this is useful.</div><div><br></div><div>There is als=
o a performance issue with having the formatting inline as you suggest.=C2=
=A0 A function hex that takes a string and returns a string would perform a=
heap allocation of the hex string and then as a second step interpolate it=
into the interpolated string.=C2=A0 By having the formatting separate this=
enables iostreams (or other interpolated string consuming libraries) to st=
ream the data directly to hex, without the intermediate value.=C2=A0 This i=
s the same concept as iostreams.</div><div><br></div></div></div>
</blockquote></div></div></blockquote></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_666_1906696658.1443278052271--
------=_Part_665_245841195.1443278052270--
.
Author: Andrew Tomazos <andrewtomazos@gmail.com>
Date: Sat, 26 Sep 2015 23:09:41 +0200
Raw View
--047d7b874e50fb31230520ace18a
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
On Sat, Sep 26, 2015 at 4:34 PM, Bengt Gustafsson <
bengt.gustafsson@beamways.com> wrote:
> In addition: By providing the formatting as part of the string rather tha=
n
> the embedded expressions translation gets a chance to change the formatti=
ng
> details. Using functions like octal(x) prevents this from being done
> without changing the source code.
>
Interesting thought, but I don't think this comes up. It is my
understanding that translation sometimes reorders the embedded expressions,
but does not change their content or formatting.
>
> Den tisdag 22 september 2015 kl. 09:18:19 UTC+2 skrev Bengt Gustafsson:
>>
>> Ok, I was unclear there. The reason for the separate function name was t=
o
>> be able to send the formatting string to it. You can't do that to a
>> operator.
>>
>> Obviously formatting information must be cryptic (printf) or verbose
>> (cout), we can't have neither. My idea was more towards cryptic of cours=
e,
>> but it does not need to be as cryptic as printf...
>>
>> The idea of destroying the flow of reading you created by introducing F"=
"
>> in the first place by putting the formatting afterwards seems really
>> awkward to me. Then I like the idea of octal(x) or hex(x) better althoug=
h I
>> wonder how it would scale to
>> multiple formatting commands. Also the std namespace gets a lot of new
>> names which could be used better, and some we would use like precision a=
re
>> already used by ostream, aren't they? Or can they be reused maybe?
>>
>> To preserve performance these functions would have to return some
>> descriptor object which I think is Tony's intention.
>>
>> Personally I'm more for cryptic than verbose now that we have to choose.
>> We have all toiled to learn the strange details and shortcomings of the
>> printf formatting, by thinking a little before designing a new terse syn=
tax
>> I think we can do much better. Here is a starting point from one project=
of
>> mine:
>>
>> // d<decimals> Number of decimals for floating point numbers.
>> // p<precision> Precision for floating or int numbers.
>> // w<width> Min width in characters. Value is left aligned.
>> // r<width> Min width in characters. Value is right aligned.
>> // c<width> Min width in characters. Value is centered.
>> // z<width> Min width in characters. Value is right aligned and padded
>> with zeros on the left.
>> // t<sep> Use <sep> (one character) as the thousand separator, inserted
>> every third digit in front of the decimal char.
>> // ; Use decimal char from locale for floating point numbers.
>> // . Use dot as decimal char.
>> // , Use comma as decimal char.
>> // m<maxwidth> Max field width. I.e. width is treated as a minimum width
>> instead of a fixed width. m without a number is treated as an infinite
>> maximum width.
>> // f Prefer normal float formatting.
>> // e Force e format.
>> // a Show All decimals. This forces trailing zeros to be added until the
>> decimals or precision of a number is satisfied.
>>
>>
>>
>> Den m=C3=A5ndag 21 september 2015 kl. 21:08:22 UTC+2 skrev Andrew Tomazo=
s:
>>>
>>>
>>>
>>> On Mon, Sep 21, 2015 at 6:11 PM, Tony V E <tvan...@gmail.com> wrote:
>>>
>>>>
>>>>
>>>> On Sun, Sep 20, 2015 at 10:55 PM, Andrew Tomazos <andrew...@gmail.com>
>>>> wrote:
>>>>
>>>>> OK, here is what I have got for formatting:
>>>>>
>>>>> Each embedded expression in an interpolated string literal, may
>>>>> optionally have a positive integer associated with. To make such an
>>>>> association, the index is placed between the introducer and the embed=
ded
>>>>> expression, and separated from the embedded expression by a colon:
>>>>>
>>>>> F"$ The register is $reg in decimal, $1:reg in hex, and $2:reg in
>>>>> octal." {std::hex, std::oct}
>>>>>
>>>>
>>>>
>>>> F"$ The register is $reg in decimal, $hex(reg) in hex, and $octal(reg)
>>>> in octal."
>>>>
>>>> where hex() and octal() are normal functions (either returning string
>>>> or some magic like a pair(format, value).
>>>> ?
>>>>
>>>
>>> Assuming the existence of such functions you could write:
>>>
>>> F"$ The register is $reg in decimal, ${hex(reg)} in hex, and
>>> ${octal(reg)} in octal."
>>>
>>> and this would work as proposed, however when the format specifiers get
>>> longer and include precision, padding, showbase, etc, etc - their verbo=
sity
>>> begins to obfuscate the expression that they appertain to, hence why I
>>> propose to provide a mechanism to index them as auxillary expressions a=
nd
>>> place them at the back (like footnotes).
>>>
>>> Also note they can repeat so:
>>>
>>> std::cout << F"$ The registers are ($spi, $pc) in decimal, ($1:spi,
>>> $1:pc) in hex, and ($2:spi, $2:pc) in octal." {std::hex, std::oct};
>>>
>>> So the formatting information can be shared amongst multiple embedded
>>> expressions. It is easy to see how this is useful.
>>>
>>> There is also a performance issue with having the formatting inline as
>>> you suggest. A function hex that takes a string and returns a string w=
ould
>>> perform a heap allocation of the hex string and then as a second step
>>> interpolate it into the interpolated string. By having the formatting
>>> separate this enables iostreams (or other interpolated string consuming
>>> libraries) to stream the data directly to hex, without the intermediate
>>> value. This is the same concept as iostreams.
>>>
>>> --
>
> ---
> You received this message because you are subscribed to the Google Groups
> "ISO C++ Standard - Future Proposals" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to std-proposals+unsubscribe@isocpp.org.
> To post to this group, send email to std-proposals@isocpp.org.
> Visit this group at
> http://groups.google.com/a/isocpp.org/group/std-proposals/.
>
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
--047d7b874e50fb31230520ace18a
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div class=3D"gmail_extra"><div class=3D"gmail_quote">On S=
at, Sep 26, 2015 at 4:34 PM, Bengt Gustafsson <span dir=3D"ltr"><<a href=
=3D"mailto:bengt.gustafsson@beamways.com" target=3D"_blank">bengt.gustafsso=
n@beamways.com</a>></span> wrote:<br><blockquote class=3D"gmail_quote" s=
tyle=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div=
dir=3D"ltr">In addition: By providing the formatting as part of the string=
rather than the embedded expressions translation gets a chance to change t=
he formatting details. Using functions like octal(x) prevents this from bei=
ng done without changing the source code.</div></blockquote><div><br></div>=
<div>Interesting thought, but I don't think this comes up.=C2=A0 It is =
my understanding that translation sometimes reorders the embedded expressio=
ns, but does not change their content or formatting.</div><div>=C2=A0</div>=
<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><div class=3D"h5"><div=
><br>Den tisdag 22 september 2015 kl. 09:18:19 UTC+2 skrev Bengt Gustafsson=
:<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;bord=
er-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr">Ok, I was unclear=
there. The reason for the separate function name was to be able to send th=
e formatting string to it. You can't do that to a operator.<div><br></d=
iv><div>Obviously formatting information must be cryptic (printf) or verbos=
e (cout), we can't have neither. My idea was more towards cryptic of co=
urse, but it does not need to be as cryptic as printf...</div><div><br></di=
v><div>The idea of destroying the flow of reading you created by introducin=
g F"" in the first place by putting the formatting afterwards see=
ms really awkward to me. Then I like the idea of octal(x) or hex(x) better =
although I wonder how it would scale to</div><div>multiple formatting comma=
nds. Also the std namespace gets a lot of new names which could be used bet=
ter, and some we would use like precision are already used by ostream, aren=
't they? Or can they be reused maybe?</div><div><br></div><div>To prese=
rve performance these functions would have to return some descriptor object=
which I think is Tony's intention.</div><div><br></div><div>Personally=
I'm more for cryptic than verbose now that we have to choose. We have =
all toiled to learn the strange details and shortcomings of the printf form=
atting, by thinking a little before designing a new terse syntax I think we=
can do much better. Here is a starting point from one project of mine:</di=
v><div><br></div><div><div><span style=3D"white-space:pre-wrap"> </span>//=
d<decimals><span style=3D"white-space:pre-wrap"> </span>Number of =
decimals for floating point numbers.</div><div><span style=3D"white-space:p=
re-wrap"> </span>// p<precision><span style=3D"white-space:pre-wrap"=
> </span>Precision for floating or int numbers.</div><div><span style=3D"=
white-space:pre-wrap"> </span>// w<width><span style=3D"white-space:=
pre-wrap"> </span>Min width in characters. Value is left aligned.</div><=
div><span style=3D"white-space:pre-wrap"> </span>// r<width><span st=
yle=3D"white-space:pre-wrap"> </span>Min width in characters. Value is r=
ight aligned.</div><div><span style=3D"white-space:pre-wrap"> </span>// c&=
lt;width><span style=3D"white-space:pre-wrap"> </span>Min width in ch=
aracters. Value is centered.</div><div><span style=3D"white-space:pre-wrap"=
> </span>// z<width><span style=3D"white-space:pre-wrap"> </span>=
Min width in characters. Value is right aligned and padded with zeros on th=
e left.</div><div><span style=3D"white-space:pre-wrap"> </span>// t<sep=
><span style=3D"white-space:pre-wrap"> </span>Use <sep> (one ch=
aracter) as the thousand separator, inserted every third digit in front of =
the decimal char.</div><div><span style=3D"white-space:pre-wrap"> </span>/=
/ ;<span style=3D"white-space:pre-wrap"> </span>Use decimal char from l=
ocale for floating point numbers.</div><div><span style=3D"white-space:pre-=
wrap"> </span>// .<span style=3D"white-space:pre-wrap"> </span>Use dot=
as decimal char.</div><div><span style=3D"white-space:pre-wrap"> </span>/=
/ ,<span style=3D"white-space:pre-wrap"> </span>Use comma as decimal ch=
ar.</div><div><span style=3D"white-space:pre-wrap"> </span>// m<maxwidt=
h><span style=3D"white-space:pre-wrap"> </span>Max field width. I.e. w=
idth is treated as a minimum width instead of a fixed width. m without a nu=
mber is treated as an infinite maximum width.</div><div><span style=3D"whit=
e-space:pre-wrap"> </span>// f<span style=3D"white-space:pre-wrap"> </=
span>Prefer normal float formatting.</div><div><span style=3D"white-space:p=
re-wrap"> </span>// e<span style=3D"white-space:pre-wrap"> </span>Forc=
e e format.</div><div><span style=3D"white-space:pre-wrap"> </span>// a<sp=
an style=3D"white-space:pre-wrap"> </span>Show All decimals. This force=
s trailing zeros to be added until the decimals or precision of a number is=
satisfied.</div><div><br></div></div><div><br></div><div><br>Den m=C3=A5nd=
ag 21 september 2015 kl. 21:08:22 UTC+2 skrev Andrew Tomazos:<blockquote cl=
ass=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #cc=
c solid;padding-left:1ex"><div dir=3D"ltr"><br><div><br><div class=3D"gmail=
_quote">On Mon, Sep 21, 2015 at 6:11 PM, Tony V E <span dir=3D"ltr"><<a =
rel=3D"nofollow">tvan...@gmail.com</a>></span> wrote:<br><blockquote cla=
ss=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;=
border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex=
"><div dir=3D"ltr"><br><div><br><div class=3D"gmail_quote"><span>On Sun, Se=
p 20, 2015 at 10:55 PM, Andrew Tomazos <span dir=3D"ltr"><<a rel=3D"nofo=
llow">andrew...@gmail.com</a>></span> wrote:<br><blockquote class=3D"gma=
il_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-le=
ft-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div di=
r=3D"ltr">OK, here is what I have got for formatting:<div><br></div><div>Ea=
ch embedded expression in an interpolated string literal, may optionally ha=
ve a positive integer associated with. To make such an association, the ind=
ex is placed between the introducer and the embedded expression, and separa=
ted from the embedded expression by a colon:</div><div><br></div><div>=C2=
=A0 F"$ The register is $reg in decimal, $1:reg in hex, and $2:reg in =
octal." {std::hex, std::oct}</div></div></blockquote></span><div><br><=
br>F"$ The register is $reg in decimal, $hex(reg) in hex, and $octal(r=
eg) in octal."<br><br></div><div>where hex() and octal() are normal fu=
nctions (either returning string or some magic like a pair(format, value).<=
br>?<br></div><div></div></div></div></div></blockquote></div><br></div><di=
v>Assuming the existence of such functions you could write:</div><div><br><=
/div><div>F"$ The register is $reg in decimal, ${hex(reg)} in hex, and=
${octal(reg)} in octal."<br></div><div><br></div><div>and this would =
work as proposed, however when the format specifiers get longer and include=
precision, padding, showbase, etc, etc - their verbosity begins to obfusca=
te the expression that they appertain to, hence why I propose to provide a =
mechanism to index them as auxillary expressions and place them at the back=
(like footnotes).</div><div><br></div><div>Also note they can repeat so:</=
div><div><br></div><div><div>=C2=A0 =C2=A0 std::cout << F"$ The =
registers are ($spi, $pc) in decimal, ($1:spi, $1:pc) in hex, and ($2:spi, =
$2:pc) in octal." {std::hex, std::oct};</div><div><br></div><div>So th=
e formatting information can be shared amongst multiple embedded expression=
s.=C2=A0 It is easy to see how this is useful.</div><div><br></div><div>The=
re is also a performance issue with having the formatting inline as you sug=
gest.=C2=A0 A function hex that takes a string and returns a string would p=
erform a heap allocation of the hex string and then as a second step interp=
olate it into the interpolated string.=C2=A0 By having the formatting separ=
ate this enables iostreams (or other interpolated string consuming librarie=
s) to stream the data directly to hex, without the intermediate value.=C2=
=A0 This is the same concept as iostreams.</div><div><br></div></div></div>
</blockquote></div></div></blockquote></div></div></div></div><div class=3D=
"HOEnZb"><div class=3D"h5">
<p></p>
-- <br>
<br>
--- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org" target=3D"_=
blank">std-proposals+unsubscribe@isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br>
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/" target=3D"_blank">http://groups.google.com/a/isocpp.org/gro=
up/std-proposals/</a>.<br>
</div></div></blockquote></div><br></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--047d7b874e50fb31230520ace18a--
.
Author: Bengt Gustafsson <bengt.gustafsson@beamways.com>
Date: Sun, 27 Sep 2015 02:11:01 -0700 (PDT)
Raw View
------=_Part_67_1877271448.1443345061523
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Translation often changes or would want to change formatting for floats (, =
vs .), dates, currency and other types. With suitable classes and correspon=
ding overloads with different interpretation of the formatting characters t=
his can be accomplished without invading the source code.
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
------=_Part_67_1877271448.1443345061523--
.
Author: Bengt Gustafsson <bengt.gustafsson@beamways.com>
Date: Sun, 27 Sep 2015 02:11:03 -0700 (PDT)
Raw View
------=_Part_3347_794621441.1443345063882
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Translation often changes or would want to change formatting for floats (, =
vs .), dates, currency and other types. With suitable classes and correspon=
ding overloads with different interpretation of the formatting characters t=
his can be accomplished without invading the source code.
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
------=_Part_3347_794621441.1443345063882--
.
Author: Andrew Tomazos <andrewtomazos@gmail.com>
Date: Mon, 28 Sep 2015 00:44:18 +0200
Raw View
--047d7bae45323a49a20520c252b5
Content-Type: text/plain; charset=UTF-8
I'm not so sure. I think the locale is set usually globally/statefully,
right? So dates, currency delimiters etc are not set and translated on a
per-string-literal basis - and therefore out-of-scope for
per-string-literal formatting.
Admittedly I don't know a lot about locales. Would need to do some further
research if this proposal was pursued.
On Sun, Sep 27, 2015 at 11:11 AM, Bengt Gustafsson <
bengt.gustafsson@beamways.com> wrote:
> Translation often changes or would want to change formatting for floats (,
> vs .), dates, currency and other types. With suitable classes and
> corresponding overloads with different interpretation of the formatting
> characters this can be accomplished without invading the source code.
>
> --
>
> ---
> You received this message because you are subscribed to the Google Groups
> "ISO C++ Standard - Future Proposals" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to std-proposals+unsubscribe@isocpp.org.
> To post to this group, send email to std-proposals@isocpp.org.
> Visit this group at
> http://groups.google.com/a/isocpp.org/group/std-proposals/.
>
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
--047d7bae45323a49a20520c252b5
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">I'm not so sure.=C2=A0 I think the locale is set usual=
ly globally/statefully, right?=C2=A0 So dates, currency delimiters etc are =
not set and translated on a per-string-literal basis - and therefore out-of=
-scope for per-string-literal formatting.<div><br></div><div>Admittedly I d=
on't know a lot about locales.=C2=A0 Would need to do some further rese=
arch if this proposal was pursued.<br><div><br></div><div><div class=3D"gma=
il_extra"><div class=3D"gmail_quote">On Sun, Sep 27, 2015 at 11:11 AM, Beng=
t Gustafsson <span dir=3D"ltr"><<a href=3D"mailto:bengt.gustafsson@beamw=
ays.com" target=3D"_blank">bengt.gustafsson@beamways.com</a>></span> wro=
te:<br><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-=
left:1px #ccc solid;padding-left:1ex">Translation often changes or would wa=
nt to change formatting for floats (, vs .), dates, currency and other type=
s. With suitable classes and corresponding overloads with different interpr=
etation of the formatting characters this can be accomplished without invad=
ing the source code.<br>
<div><div><br>
--<br>
<br>
---<br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals%2Bunsubscribe@isocpp.org" target=3D=
"_blank">std-proposals+unsubscribe@isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br>
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/" rel=3D"noreferrer" target=3D"_blank">http://groups.google.c=
om/a/isocpp.org/group/std-proposals/</a>.<br>
</div></div></blockquote></div><br></div></div></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--047d7bae45323a49a20520c252b5--
.
Author: Ville Voutilainen <ville.voutilainen@gmail.com>
Date: Mon, 28 Sep 2015 02:25:40 +0300
Raw View
On 28 September 2015 at 01:44, Andrew Tomazos <andrewtomazos@gmail.com> wrote:
> I'm not so sure. I think the locale is set usually globally/statefully,
> right? So dates, currency delimiters etc are not set and translated on a
> per-string-literal basis - and therefore out-of-scope for per-string-literal
> formatting.
> Admittedly I don't know a lot about locales. Would need to do some further
> research if this proposal was pursued.
That seems to assume that std::locales and their associated facets would be used
for localization, which is a bold assumption.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
.
Author: Andrew Tomazos <andrewtomazos@gmail.com>
Date: Mon, 28 Sep 2015 02:35:37 +0200
Raw View
--047d7bae4532587d310520c3e00a
Content-Type: text/plain; charset=UTF-8
On Mon, Sep 28, 2015 at 1:25 AM, Ville Voutilainen <
ville.voutilainen@gmail.com> wrote:
> On 28 September 2015 at 01:44, Andrew Tomazos <andrewtomazos@gmail.com>
> wrote:
> > I'm not so sure. I think the locale is set usually globally/statefully,
> > right? So dates, currency delimiters etc are not set and translated on a
> > per-string-literal basis - and therefore out-of-scope for
> per-string-literal
> > formatting.
> > Admittedly I don't know a lot about locales. Would need to do some
> further
> > research if this proposal was pursued.
>
>
> That seems to assume that std::locales and their associated facets would
> be used
> for localization, which is a bold assumption.
>
> I think what would be needed is a survey of current processes/techniques/
needs for translation/internationalization/localization and then to make
sure the proposal is compatible with them.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
--047d7bae4532587d310520c3e00a
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><div class=3D"gmail_extra"><br><div class=3D"gmail_quo=
te">On Mon, Sep 28, 2015 at 1:25 AM, Ville Voutilainen <span dir=3D"ltr">&l=
t;<a href=3D"mailto:ville.voutilainen@gmail.com" target=3D"_blank">ville.vo=
utilainen@gmail.com</a>></span> wrote:<br><blockquote class=3D"gmail_quo=
te" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-col=
or:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span class=
=3D"">On 28 September 2015 at 01:44, Andrew Tomazos <<a href=3D"mailto:a=
ndrewtomazos@gmail.com">andrewtomazos@gmail.com</a>> wrote:<br>
> I'm not so sure.=C2=A0 I think the locale is set usually globally/=
statefully,<br>
> right?=C2=A0 So dates, currency delimiters etc are not set and transla=
ted on a<br>
> per-string-literal basis - and therefore out-of-scope for per-string-l=
iteral<br>
> formatting.<br>
> Admittedly I don't know a lot about locales.=C2=A0 Would need to d=
o some further<br>
> research if this proposal was pursued.<br>
<br>
<br>
</span>That seems to assume that std::locales and their associated facets w=
ould be used<br>
for localization, which is a bold assumption.<br>
<div class=3D""><div class=3D"h5"><br></div></div></blockquote><div>I think=
what would be needed is a survey of current processes/techniques/ needs fo=
r translation/internationalization/localization and then to make sure the p=
roposal is compatible with them.</div><div><br></div></div></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--047d7bae4532587d310520c3e00a--
.
Author: Ville Voutilainen <ville.voutilainen@gmail.com>
Date: Mon, 28 Sep 2015 04:18:37 +0300
Raw View
On 28 September 2015 at 03:35, Andrew Tomazos <andrewtomazos@gmail.com> wrote:
>> That seems to assume that std::locales and their associated facets would
>> be used
>> for localization, which is a bold assumption.
> I think what would be needed is a survey of current processes/techniques/
> needs for translation/internationalization/localization and then to make
> sure the proposal is compatible with them.
I couldn't agree more, because the current processes and techniques are
what Bengt and I are referring to, so I highly recommend performing
such surveys,
and I even recommend performing such surveys before dismissing feedback.
Such a survey might not find what you're looking for, though, because I get
a nagging feeling either Bengt or I may be talking about things that aren't
necessarily open-source. ;)
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
.
Author: Bengt Gustafsson <bengt.gustafsson@beamways.com>
Date: Tue, 29 Sep 2015 01:22:13 -0700 (PDT)
Raw View
------=_Part_5527_982316194.1443514933467
Content-Type: multipart/alternative;
boundary="----=_Part_5528_1547745907.1443514933467"
------=_Part_5528_1547745907.1443514933467
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Using the global locale is tricky as more often than not changing this from=
=20
"C" breaks file importers/exporters which don't set up the locale of the=20
streams they use. Usually this file related code is hidden in some library=
=20
you found on the internet and usually the problem shows up on some=20
customer's computer in a far away country. Almost always it is the decimal=
=20
comma or point that causes the problem. The core issue seems to be that=20
language designers (and OS designers) didn't understand that programs don't=
=20
always read and write files created in the same locale and that well=20
specificed file formats usually define such things as the decimal=20
characters regardless of locale.
Ideally, of course, the global locale should only be used when the text I/O=
=20
is directly at the local user of the software but as it is default when=20
creating all streams you usually get all text file I/O in the bargain. This=
=20
is even worse in C where for instance with fprintf there is no way to=20
override the global locale. There is an amazing amount of file I/O code=20
still using fscanf/fprintf which prevents changing the global C locale from=
=20
the default. (Forgive me for not remembering how/if the C and C++ locale=20
setting is linked in any way).
It is true that there are many examples of proprietary translation/locale=
=20
handling schemes, but there should be enough ideas in the open source world=
=20
to give data points all around the design space.
Den m=C3=A5ndag 28 september 2015 kl. 03:18:39 UTC+2 skrev Ville Voutilaine=
n:
>
> On 28 September 2015 at 03:35, Andrew Tomazos <andrew...@gmail.com=20
> <javascript:>> wrote:=20
> >> That seems to assume that std::locales and their associated facets=20
> would=20
> >> be used=20
> >> for localization, which is a bold assumption.=20
> > I think what would be needed is a survey of current=20
> processes/techniques/=20
> > needs for translation/internationalization/localization and then to mak=
e=20
> > sure the proposal is compatible with them.=20
>
> I couldn't agree more, because the current processes and techniques are=
=20
> what Bengt and I are referring to, so I highly recommend performing=20
> such surveys,=20
> and I even recommend performing such surveys before dismissing feedback.=
=20
>
> Such a survey might not find what you're looking for, though, because I=
=20
> get=20
> a nagging feeling either Bengt or I may be talking about things that=20
> aren't=20
> necessarily open-source. ;)=20
>
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
------=_Part_5528_1547745907.1443514933467
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">Using the global locale is tricky as more often than not c=
hanging this from "C" breaks file importers/exporters which don&#=
39;t set up the locale of the streams they use. Usually this file related c=
ode is hidden in some library you found on the internet and usually the pro=
blem shows up on some customer's computer in a far away country. Almost=
always it is the decimal comma or point that causes the problem. The core =
issue seems to be that language designers (and OS designers) didn't und=
erstand that programs don't always read and write files created in the =
same locale and that well specificed file formats usually define such thing=
s as the decimal characters regardless of locale.<div><br><div>Ideally, of =
course, the global locale should only be used when the text I/O is directly=
at the local user of the software but as it is default when creating all s=
treams you usually get all text file I/O in the bargain. This is even worse=
in C where for instance with fprintf there is no way to override the globa=
l locale. There is an amazing amount of file I/O code still using fscanf/fp=
rintf which prevents changing the global C locale from the default. (Forgiv=
e me for not remembering how/if the C and C++ locale setting is linked in a=
ny way).</div><div><br></div><div>It is true that there are many examples o=
f proprietary translation/locale handling schemes, but there should be enou=
gh ideas in the open source world to give data points all around the design=
space.</div><div><br></div><div><br></div><div><br><br>Den m=C3=A5ndag 28 =
september 2015 kl. 03:18:39 UTC+2 skrev Ville Voutilainen:<blockquote class=
=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #cc=
c solid;padding-left: 1ex;">On 28 September 2015 at 03:35, Andrew Tomazos &=
lt;<a href=3D"javascript:" target=3D"_blank" gdf-obfuscated-mailto=3D"dMZ5Y=
VKECQAJ" rel=3D"nofollow" onmousedown=3D"this.href=3D'javascript:';=
return true;" onclick=3D"this.href=3D'javascript:';return true;">an=
drew...@gmail.com</a>> wrote:
<br>>> That seems to assume that std::locales and their associated fa=
cets would
<br>>> be used
<br>>> for localization, which is a bold assumption.
<br>> I think what would be needed is a survey of current processes/tech=
niques/
<br>> needs for translation/<wbr>internationalization/<wbr>localization =
and then to make
<br>> sure the proposal is compatible with them.
<br>
<br>I couldn't agree more, because the current processes and techniques=
are
<br>what Bengt and I are referring to, so I highly recommend performing
<br>such surveys,
<br>and I even recommend performing such surveys before dismissing feedback=
..
<br>
<br>Such a survey might not find what you're looking for, though, becau=
se I get
<br>a nagging feeling either Bengt or I may be talking about things that ar=
en't
<br>necessarily open-source. ;)
<br></blockquote></div></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_5528_1547745907.1443514933467--
------=_Part_5527_982316194.1443514933467--
.