1

タブで区切られたテキスト行から単語のリストを作成したいと考えています。基本的に、行をタブで分割してアトムに分割したいと考えています。

以下のコードは一種の疑似コードですが、これはこの種のことを行うための最良のアプローチですか?

これが私の最初の試みです:-

(defun get-hdr()
    ;obviously point must be positioned on correct line
    (let (mylist)
      (while(not (end-of-line)
         (while(re-search-forward ("[A-Za-z]+[^\t\n]" nil t)
           (append (match-string 1) mylist)      
         ))
      ))
   )
)

関数がリスト mylist を返すようにするにはどうすればよいですか?

4

1 に答える 1

1

ループの最後で評価するだけです。

(defun get-hdr ()
  (let (mylist)
     (while (not (end-of-line))  ; missing closing parenthesis added
        (while (re-search-forward ("[A-Za-z]+[^\t\n]" nil t)) ; ditto
           (setq mylist (append (match-string 1) mylist)) ) ) ; note setq
     mylist) )

ただし、この種のシナリオではcons代わりに使用するのが通例です。append最後に、リストを逆にしたい場合があります。

(defun get-hdr ()
  (let (mylist)
     (while (not (end-of-line))
        (while (re-search-forward ("[A-Za-z]+[^\t\n]" nil t))
           (setq mylist (cons (match-string 1) mylist) ) ) )
     (reverse mylist)) )

http://www.gnu.org/software/emacs/manual/html_node/elisp/Building-Lists.htmlも参照してください。これはappend、より広いコンテキストでの機能について説明しています。

多くのシナリオでは、関数がユーザーの正規表現一致データまたはバッファー位置を台無しにするべきではありません。フォームの周りにラッパーを追加することを検討してsave-excursionください。save-match-datalet

しかし、あなたが述べた目的のために、おそらくあなたが必要とするのは

(split-string (buffer-substring-no-properties (point) (line-end-position)) "\t")

(ドキュメンテーション)

于 2013-04-16T10:12:36.310 に答える