LINUX.ORG.RU

[CL] format итерации


0

1

Привет!

Хочу сгенерировать следующую строку: x=1 or x=2 or x=3.

(format nil "~{x=~a~^ or ~}" '(1 2 3))

А как поступить, если сам «х» я тоже хочу задать в параметрах формата?

http://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node200.html курил, курил, но так и не вкурил.

★★★★★

Я бы в любом случае не стал использовать format для более-менее сложного форматирования, для этого есть другие средства.

archimag ★★★
()
Ответ на: комментарий от archimag

>Я бы в любом случае не стал использовать format для более-менее сложного форматирования, для этого есть другие средства.

Почему? И какие? Вручную я конечно без проблем соберу эту строку...

staseg ★★★★★
() автор топика
Ответ на: комментарий от staseg

> Почему?

Потому что этот eDSL, задающий правила форматирования, в сложных случаях совершенно «write-only».

И какие?


В зависимости от ситуации, начиная от with-output-to-string и заканчивая специализированными системами шаблонов.

archimag ★★★
()
Ответ на: комментарий от archimag

Что не так с format eDSL? Это абсолютно адекватный инструмент.

в сложных случаях


Так это они только для тебя сложные. Профессиональный лиспер не испытывает затруднений в работе с любыми конструкциями format eDSL.

совершенно «write-only»


Кто виноват, что ты не можешь разобраться в собственном коде, написанном неделю назад?

В зависимости от ситуации, начиная от with-output-to-string и заканчивая специализированными системами шаблонов.


Костыли-костылики для неосилятора Lisp way.

anonymous
()
Ответ на: комментарий от anonymous

Анон, не будь голословным, подскажи рецепт для формата в моем случае.

staseg ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Глупый троллинг. Мне и самому не нравятся некоторые высказывания архимага, но тут он совершенно прав. Язык format (и loop до кучи) никак не укладывается в lisp-way. Чего стоит уже то, что его невозможно расширить собственными директивами. Удивительно, что такие вещи вообще попадают в стандарт языка, в котором в основу положена синтаксическая однородность.

Вот тут предложена адекватная замена: http://www.cs.yale.edu/homes/dvm/format-stinks.html

anonymous
()
Ответ на: комментарий от anonymous

format можно расширять, во-первых.
во-вторых, lisp-way это как раз расширение языка под задачу, и DSL'и направо и налево, а не какая-то мифическая «синтаксическая однородность»(у CL если и есть какая-то однородность, так это семантическая(в плане того что код это s-выражения), а не синтаксическая).

lovesan

anonymous
()

Можешь так:

(defvar *foo* nil)

(defun foo (s o &rest args)
  (declare (ignore o args))
  (write *foo* :stream s))

(let ((*foo* 'x))
  (format t "~{~/foo/~:*=~a~^ or ~}" '(1 2 3)))

anonymous
()
Ответ на: комментарий от anonymous

>Можешь так:

Это полный звиздец. Видимо придется оставить сборку этой строки руками.

staseg ★★★★★
() автор топика
Ответ на: комментарий от staseg

А че руками? Ну смотри как оно руками:

(let ((list '(1 2 3))
      (param 'x))
  (with-output-to-string (out)
    (loop :for (f . r) :on list
      :do (format out "~a=~a~:[~; or ~]" param f r))))
Сильно короче и понятнее?

Смысл моего первого решения в том, что «~//» - вызывает функцию для форматирования.

Ты ее можешь потом реюзать. Можешь даже обозвать покороче, чтобы больше походило на перл, гг.

(defvar *@* nil)

(defun @ (s o &rest args)
  (declare (ignore o args))
  (write *@* :stream s))

(let ((*@* 'x))
  (format t "~{~/@/~:*=~a~^ or ~}" '(1 2 3)))

anonymous
()
Ответ на: комментарий от anonymous

Кстати, основная фича, которая в ~// мне сильно доставляет, так это то, что можно делать вот так:

(defpackage #:xsd (:export #:dateTime))

(defun xsd:dateTime (stream time &rest args)
  (declare (ignore args))
  (multiple-value-bind
      (s m h day month yr dw dst tz) (decode-universal-time time)
    (declare (ignore dw dst))
    (format stream "~4,'0d-~2,'0d-~2,'0dT~2,'0d:~2,'0d:~2,'0d~@d"
            yr month day
            h m s
            tz)))

(format t "~/xsd:dateTime/" (get-universal-time))
;; ==> 2011-11-24T23:24:30-4

Круто, да? Это вот, по-моему, вообще офигенно. Проникнись идеей.

lovesan

anonymous
()
Ответ на: комментарий от anonymous

ну там последнюю цифру подправить немного, а то не совсем вписывается в формат xsd, но суть понятна.

anonymous
()
Ответ на: комментарий от anonymous

> Круто, да?

Круто. Куча говнокода вместо DateFormat.getInstance().format().

Проникнись идеей.


Идеей дрочить вприсядку вместо того, чтобы делать дело? Дооооо, проникся.

ЗЫ. Schema-aware XML процессор решил навелосипедить штоле?

anonymous
()
Ответ на: комментарий от anonymous

>DateFormat.getInstance().format().
Сракотан какой.
XmlConvert.ToString(DateTime), чудила, если говорить о конкретике.

Идею ты(vertexua?) не понял, естественно, потому что долбоеб.
Автор топика, надеюсь, умнее.

lovesan

anonymous
()
Ответ на: комментарий от anonymous

> Автор топика, надеюсь, умнее.

Автор топика уже высказал всё, что он думает о твоей бредятине. Так что ты опять остался в одиночестве со своими наркоманскими идеями.

Но для успокоения можешь считать, что ты д'Артаньян и весь в белом, а все остальные — пидарасы. Очень помогает.

anonymous
()
Ответ на: комментарий от anonymous

>Автор топика уже высказал всё, что он думает о твоей бредятине. Так что ты опять остался в одиночестве со своими наркоманскими идеями.

Автор топика внимательно наблюдает и проникается идеей. Пока безуспешно, но все же.

staseg ★★★★★
() автор топика
Ответ на: комментарий от staseg

> Пока безуспешно, но все же.

Открою секрет: это нормально. Идеи и заявления лиспохаскелистов вообще следует трижды пропускать через призму здравомыслия, т.к. именно среди них процент неадекватов особенно высок. И даже за внешне логичной идеей может на самом деле скрываться лютая бредятина. Рекомендую ознакомиться с хрестоматийным примером.

anonymous
()

Суть лиспа ITT

Пора подводить итоги.

ТС: Привет! Хочу сгенерировать строку, суть такова...

Программист: (решение в три строчки на любом современном ЯП)

Лиспер: DSL, eDSL, расширяемый eDSL, with-output-to-string, специализированные системы шаблонов, Lisp way, синтаксическая однородность, семантическая однородность, defvar, defun, declare, let, format, multiple-value-bind, пространства имён, анафорические лямбды, пандорический захват, S-выражения, M-выражения, readtable, SICP, HtDP, абстрактная виртуальная лисп-машина, отслеживание консистентности, структурная компиляция, Y-комбинаторы (решение не приведено)

anonymous
()
Ответ на: Суть лиспа ITT от anonymous

решение в три строчки на любом современном ЯП

решение не приведено

К окулисту, потом сюда :)

quasimoto ★★★★
()
Ответ на: комментарий от anonymous

Учись кастовать, а то мог бы не заметить твой ценный пост.

vertexua ★★★★★
()
Ответ на: Суть лиспа ITT от anonymous

Не совсем корректно, ТС задал вопрос о решении именно на Лиспе, что и обсуждается

vertexua ★★★★★
()
Ответ на: комментарий от anonymous

> lisp-way это как раз расширение языка под задачу, и DSL'и направо и налево

Это не значит, что надо применять направо и налево DSL, которые сделаны совершенно говенным образом. А format - как раз так и сделан.

anonymous
()
Ответ на: комментарий от anonymous

Ну тогда очевидно, что задача ОПа не является подмножеством задачи format. Т.к. средствами format задача ОПа нерешаема.

anonymous
()
Ответ на: комментарий от anonymous

> Ну тогда очевидно, что задача ОПа не является подмножеством задачи format. Т.к. средствами format задача ОПа нерешаема.

Годно, thumbsup

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.