(elisp dash.el) помогите переписать неуклюжий код - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь создать композицию в тире, которая выполняет следующее - разбивает на строки - удаляет пустые строки - сохраняет строки, начинающиеся с "N" - возвращает расширение имени файла

Однако код ниже чувствуетнеуклюжий - интересно, если кто-нибудь может помочь упростить / переписать это.

(let ((line-sep "\\\n")
      (new-ind "^N ")
      (sample-output "
N /dir1/file1.el
N /dir1/file2.dot
  /dir1/file3.py
  /dir1/file4.sql"))
  (funcall
   (-compose
    (-partial '-map (lambda(x) (file-name-extension (nth 1 (split-string x)))))
    (-partial '-filter (-partial 'string-match-p new-ind)) ; keep lines starting w/"N"
    (-partial '-filter (lambda(x) (> (length x) 0))) ; remove empty lines
    (-partial (-flip 'split-string) line-sep)) ; split into lines
   sample-output))

1 Ответ

0 голосов
/ 14 марта 2019

После того, как дурачиться с ним, похоже, что конвейер компоновки работает хорошо только тогда, когда все функции принимают один и тот же тип аргумента. Я переписал это примерно так, и это выглядит лучше. хотел бы услышать комментарии ..

(let* ((line-sep "\\\n")
       (lexical-binding t)
       (new-ind "^\\s-*N ")
       (sample-output "
    N /dir1/file1.el
    N /dir1/file2.dot
      /dir1/file3.py
      /dir1/file4.sql")
       (lines (split-string sample-output "\\\n")))

  (-annotate
   'file-name-extension
   (-map
    (-compose
     (-partial 'nth 2)
     (-partial (-flip 'split-string) "\\s-+"))
    (--filter
     (string-match-p "^\\s-*N " it)
     lines))))
...