- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
private static string AddStr(string s1, string s2)
{
string result;
if (s1 == string.Empty)
{
result = s2;
}
else
{
if (s2 == string.Empty)
{
result = s1;
}
else
{
result = s1 + " " + s2;
}
}
return result;
}
то есть так сливать массивы лучше?
я не говорил, что код поста хорош - я сказал что приведенный - еще хуже
Имхо - нет. И оригинал был нагляднее (если пофиксить некоторые недоразумения типа обработки null'ов).
Но я о другом писал - мне кажется, что автор будет в цикле бежать по какому-нибудь массиву строк и вызывать функцию из топика для аккумулятора и текущей строки (говноаналог string.Join(" ", array))... И я искренне надеюсь, что эту функцию не юзают в таком контексте... Вот из-за этого у меня сомнения в нужности данной функции.
string.join(" ", array), если не учетывать потенциальную пустоту строк. А если учитывать - можно сначала отфильтровать их, а потом join.
можно фильтровать в процессе слияния
Только надо метод переименовать. И я бы через условный оператор написал.
А вариант с Format + Trim - гадость.
Там потенциально может захотеться еще и отчество добавить... Поэтому я бы или 3 аргумента сделал (и назвал бы соответственно), или методом к объекту, хранящему инфе о человеке прикрутил...
Потенциально может и не захотеться. Код интернационален, комментариев на русском мы в нём не видим. Откель нам знать, что у пользователей этого софта вообще есть отчество. У них там за бугром вторые имена в ходу.
Прям таки везде "за бугром"? Кое-где, например, встречаются двойные имена.
По крайней мере оно предсказуемей чем Format+Trim, которые пожирают пробельные символы по краям s1 и s2.
Тем более в покоцаном виде.
;)
Почему такое странное имя для функции проверяющей на непустоту строки, если не секрет?
> (+ (%f a) (* 2 (%f b)))
> "~[~2*~;~a~*~;~*~a~;~a ~a~]"
А если строк будет три? :)
Почему?
Почему не рабочий: %f всегда возвращает true. remove-if-not ничего не удалит.
Ну, предположительно, для большого количества строк эта функция не нужна, т.как можно просто сделать (format ? "~{~a~^ ~}").
Хм, да, тупанул я. В лиспе же только nil это false.
В каких?
А живущим у подножья олимпа их юзать строжайше запрещено... А в вашем случае % это нечто используемое лисперами в повседневной практике. Поэтому, имхо, ассоциация не катит...
P.S. А почему бы не назвать эту функцию просто f, ведь за скоп labels'ов ее имя не вылезет. С пометкой глобальных переменных звездочками я полностью согласен, а вот локальные, имхо, помечать не стоит.
В Лиспе нет глобальных переменных.
Это не предикат, с чего бы ее так называть? Она просто техническая функция без какого-то определенного названия.
А ну да, я забыл, что она возвращает не nil/t, а 0/1. Тогда да, not-empty не катит.
> В Лиспе нет глобальных переменных.
defvar package-private получается?
defvar создает символ и объявляет связаную с ним переменную как "специальную" + если это происходит в топ-левел, следит за тем, чтобы значение переменной обозначенной этим символов назначалось только один раз (т.е. при повторном прочтении файла значение не будет переустановлено). Но если сильно хочется, то можно потом отменить "специальность" этой переменной.
Ага, т.е. все-таки package-private получается.
> отменить "специальность" этой переменной
Насовсем, или только внутри какого-то скопа?
Отменить можно вообще. Это свойство хранится в списке свойств символа, а он как-бы один всегда.
Каждый пакет имеет свой неймспейс для символов?
Все, кажется понял, что такое special. Просто флаг, увидев который let'ы, setf'ы, и обращения к помеченному им символу раскрываются в другой код.
Пакет сам по себе и является "неймспейсом" для символов. "Неймспейсом" в том смысле, в котором бы это слово использовалось в Ц++.
Дилан, на сколько я понимаю, тоже Лисп-1.
А я бы написал not-empty, все-таки хоть имя для такой мелочи в таких мелких скопах и не важно, но с именем читать как-то приятней.
sprintf(..., "%s%s%s", a, " "+(!*a||!*b), b);
Сложение, а не индекс. Ну и первая строка ещё.
Да, все верно.
1. Консит новую память (плохо).
2. Можно передать больше двух параметров (не эквивалентно исходному варианту).
Вариант с printf в принципе похож, но я сам ничего не выбираю, выбор описан декларативно в строке формата. Полным аналогом было бы (format stream (aref #("~a ~a" ...)) a b)
> Консит новую память (плохо).
Есть такая проблема. Но с произвольным количеством строк по другому, походу, и не получится.
> Можно передать больше двух параметров (не эквивалентно исходному варианту)
Да я хотел немного универсальности добавить... Отсюда и переименование в join-strings.
Если уже пользоваться форматом, так для всего.
А нет ли там какой-то конструкции в format'е, которая управлялась бы не числом а nil/t?