2014-10-15 3 views
3

Я пытаюсь вставить строку, разделенную запятыми, созданную из нескольких значений, введенных пользователем. Если определенное значение пусто, я не хочу вставлять это значение. Моя проблема заключается в том, что mapconcat по-прежнему вставляет разделитель, когда функция возвращает nil. Я также попытался сделать это с помощью элемента управления unless в списке вместо функции с тем же результатом.Игнорировать пустые строки в mapconcat?

(insert (mapconcat 
     (function (lambda (x) (unless (string-equal x "") x)))) 
     (list input-a input-b input-c) 
     ", ")) 

Если значение от пользователя является "foo", "" и "bar", выход будет "foo, , bar"; Я бы хотел, чтобы это было "foo, bar". Как я могу предотвратить включение разделителя, когда входное значение пуст?

+0

Вы также хотите игнорировать строки, содержащие только пробелы? Например, '' ''? –

ответ

6

Ваш список содержит nil значения, и mapconcat еще будет обрабатывать те, так что вам нужно удалить ненужных элементов из списка первыми.

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

(setq my-list (list "foo" "" "bar")) 
(mapconcat 'identity 
      (remove "" my-list) 
      ", ") 

Если вы не нуждаетесь в оригинале, вы могли бы использовать delete вместо remove; но убедитесь, что вы прочитали справку для delete, если вы это сделаете.

Смежные вопросы