Регистрация | Войти
Lisp — программируемый язык программирования
RSS
Строковые литералы для лиспа почти как в Питоне
den73 - 06.04.2017 15:46, Сообщений - 9
Внезапно осознал, что литералы типа

"""а вот моя "" строеча"""

Почти не противоречат стандарту CL. Почти - потому что в CL легальна запись """" (пустая строка и за ней ещё пустая строка) и я даже нашёл пример этого в исходниках Hemlock. Однако для тех, кто думает не только о прошлом, но и о будущем, это не должно стать проблемой. В конце концов, ничто не мешает найти все вхождения последовательности из трёх двойных кавычек в исходнике.

В итоге я реализовал такие строки для своей конфигурации CL. В отличие от Python, обратная косая не является спец.буквой внутри тройных кавычек. Поэтому, если нужно, чтобы строка содержала внутри себя три кавычки, строку нужно удвоить:

CL-USER>"""три """""" банана"""
"три \"\"\" банана"

В принципе можно сделать и печать, но ЕМНИП печать строк нельзя перебить переносимым образом - в некоторых реализациях она прибита гвоздями. Впрочем, я пока не пробовал.
Код здесь https://bitbucket.org/budden/budden-tools/src/default/buddens-readmacros.lisp?at=default&fileviewer=file-view-default , начиная со слов: 
;;; Triple quote reader

Тесты - рядом в файле buddens-readmacros-test
Не считая тестов, код вполне standalone и желающие могут сделать из него библиотечку для quicklisp.
[#]
Почему бы тогда не сделать подобие template literals из ES2015? Мне кажется было бы прикольней.
archimag - 06.04.2017 16:39
[#] Ответ на комментарий от archimag 06.04.2017 16:39
Ну, я думаю такие вещи уже сделаны для лиспа неоднократно. Вопрос - задействовать ли три кавычки под эти template literals? Я бы сделал функцию, подобную format. Было бы чуть менее синтаксически сахарно, но тогда
можно было бы иметь и то, и другое. Смысл трёх кавычек - избавление от "escape hell". Т.е. можно было бы использовать три кавычки отдельно, а template literals - отдельно.
den73 - 06.04.2017 17:51
[#] Ответ на комментарий от archimag 06.04.2017 16:39
Голосую за сближение CL и JS всеми способами =)
LinkFly - 09.04.2017 12:46
[#] Ответ на комментарий от den73 06.04.2017 17:51
Почти не противоречат стандарту CL

Именно "почти", т.е. противоречат, думается.
Допустим есть код подключения к чему либо (connect-something "" "login" "" "pass" "")
Согласно стандарту, программист волен написать (connect-something """login""""pass""") что с включенным твоим парсером будет означать вызов с одной строкой.

В частности из-за таких неочевидных и внезапных нюансов я и говорю: синтаксис зло.

Я правильно понимаю что под "escape hell" имеется в виду ситуация в которой нужно многократно печатать и прочитатывать строку содержащую кавычки?
Если да, то может поискать другой способ решения? Например, закодировать кавычки в строке как-нибудь вроде #quote, а потом в нужный момент раскодировать?

LinkFly - 09.04.2017 12:58
[#] Ответ на комментарий от LinkFly 09.04.2017 12:58
Да, противоречит. "Почти" значит, что на практике я нашёл всего один пример в исходниках SBCL, Hemlock и всём, что у меня есть из quicklisp (итого 36Мб). 
Т.е. вред минимален и места повреждений легко грепятся. Кроме того, я их использую только в своей таблице чтения. 

Другие решения существуют, но в питоне к ним не нужно прибегать. Поэтому конкурентоспособность с Питоном по этому пункту снижена. Заметь, в Питоне не постеснялись поменять способ использования функции print при переходе с версии 2 на версию 3, и всё равно Питон популярнее лиспа. Бороться с этим можно лишь улучшая Лисп и не боясь вносить breaking changes. 



den73 - 11.04.2017 11:45
[#] Ответ на комментарий от den73 11.04.2017 11:45
Заметь, в Питоне не постеснялись поменять способ использования функции print при переходе с версии 2 на версию 3
Питон намного моложе CL так что ничего удивительного в кардинальной перестройке новой версии (думаю, найдуться и другие причины такой "смелости", в частности возможно то, что такие решение принимает один человек - Гвидо, создатель языка, хотя не знаю).

> ... и всё равно Питон популярнее лиспа
Эту тему я предлагаю не развивать, так как популярность/непопулярность какой-либо технологии либо языка завязаны на целой "каше" причин (кстати, в которых удобство/технологичность - далеко не всегда приоритетны и понимаются многими по разному)

> Бороться с этим можно лишь улучшая Лисп и не боясь вносить breaking changes. 
"breaking changes" не нужны - просто потому что, без этого можно обойтись. Да и вообще какие-то мелкие поправки к синтаксису - не нужны.
Что касается развития языка - могут быть полезны серьёзные концептуальные вещи ( некоторые идеи, можно поискать тут: http://www.european-lisp-symposium.org/2017/index.html ) Также полезен анализ и реализация CDR - https://common-lisp.net/project/cdr/final.html ,
И разумеется - развитие эко-системы (библиотек).

Кроме того, я их использую только в своей таблице чтения.
Ну собственно в библиотеках такому и места и всё равно лучше бы акцентироваться внимание на более важных вещах (хотя кого что "вшторивает", конечно).
LinkFly - 11.04.2017 17:07
[#] Ответ на комментарий от LinkFly 11.04.2017 17:07
Да я не акцентируюсь на этих литералах - сделал и забыл, по правде сказать. Хотя я не прекращу думать, что для привлечения новичков такие мелочи важны. Уже даже в С++ сильно расширили возможности строковых литералов и теперь, по сути там есть всё, что надо. И лисп теперь даже от С++ отстаёт в этом отношении. Касаемо остальных идей - ну да, они хороши, но у меня нет в них нужды. А строковые литералы конкретно раздражали постоянно. Теперь почти не раздражают. 

den73 - 11.04.2017 19:29
[#] Ответ на комментарий от den73 11.04.2017 19:29
Это был велосипед: https://github.com/smithzvk/pythonic-string-reader
Источник информации: https://groups.google.com/forum/#!topic/comp.lang.lisp/q31IdPlFFbY
den73 - 14.05.2017 13:31
[#] Ответ на комментарий от den73 14.05.2017 13:31
Забавно, что у того же автора есть и версионные объекты. 
den73 - 14.05.2017 13:33
@2009-2013 lisper.ru