Есть пара ответов, не относящихся к C #, и в оригинальном сообщении действительно запрашивались ответы на любом языке, поэтому я подумал, что покажу другой способ сделать это, которого, похоже, никто из программистов C # не коснулся: DSL!
(defun quibble-comma (words)
(format nil "~{~#[~;~a~;~a and ~a~:;~@{~a~#[~; and ~:;, ~]~}~]~}" words))
Проницательный заметит, что в Common Lisp на самом деле нет встроенного IEnumerable<T>
, и, следовательно, FORMAT
здесь будет работать только с правильным списком. Но если вы сделали IEnumerable
, вы наверняка могли бы расширить FORMAT
, чтобы работать и над этим. (Есть ли у Clojure это?)
Кроме того, любой, кто читает это, кто имеет вкус (включая программистов на Лиспе!), Вероятно, будет оскорблен там буквальным "~{~#[~;~a~;~a and ~a~:;~@{~a~#[~; and ~:;, ~]~}~]~}"
. Я не буду утверждать, что FORMAT
реализует хороший DSL, но я верю, что чрезвычайно полезно иметь несколько мощных DSL для объединения строк. Regex - это мощный DSL для разделения строк, а string.Format
- это DSL (своего рода) для объединения строк, но он глупо слаб.
Я думаю, что все пишут такие вещи все время. Почему, черт возьми, еще нет встроенного универсального со вкусом DSL для этого? Я думаю, что самый близкий у нас "Perl", может быть.