xyzzy lispで日付置換マクロ
Lispの初実用プログラム。
日付の部分を置換してくれるだけ。どう見ても自分用です。本当に(ry
とりあえずこんな感じのテキストファイルを
{%g%e年%m月%d日} 〜 {%g%e年%m月%d日}
- -
{%m月%d日}
- -
{%m月%d日}
- -
{%m月%d日}
- -
{%m月%d日}
- -
{%m月%d日}
- -
{%m月%d日}
こうする。
平成20年10月18日 〜 平成20年10月24日
- -
10月18日
- -
10月19日
- -
10月20日
- -
10月21日
- -
10月22日
- -
10月23日
- -
10月24日
土曜日始まりフォーマット、月曜が提出期限なのでそれにあわせたベタ実装。
ファイル名は金曜の日付になります。
;.xyzzyへの設定は下の一行を追加 ;(require "my-set-date") (provide "my-set-date") (in-package "editor") (export '(set-date)) ;---------------------------------------------------- ;;関数定義 ;;月0火1水2木3金4土5日6から開始日の土曜が何日前かを計算。 (defun get-offset(day) (* -1 (if(= day 0) 9 (+ day 2)))) ;;n番目の要素を置き換えたリストを生成する (defun replace-nth(sequence new n) (if (= n 0) (cons new (cdr sequence)) (cons (car sequence) (replace-nth (cdr sequence) new (- n 1))))) ;;dateにoffsetを加算した日付を返す (defun calc-day(date offset) (replace-nth date (+ offset (fourth date)) 3)) ;;指定されたフォーマットで日付の文字列を返す。 (defun my-format-date(date date-format) (let ((S (first date));秒 (M (second date));分 (H (third date));時 (d (fourth date));日 (m (fifth date));月 (y (sixth date));年 ) (format-date-string date-format (encode-universal-time S M H d m y)))) ;---------------------------------------------------- ;; 処理 ;現在日を取得 (setq current-date (multiple-value-list (get-decoded-time))) ;開始日を計算 (setq date-reference (calc-day current-date (get-offset (seventh current-date)))) ;作成ファイルを保存するパス (setq file-path "C:/yet/another/lisp/") ;作成ファイル名 (setq file-name (concat "prefix_hoge" (my-format-date (calc-day date-reference 6) "%y%m%d") ".txt")) ;置換処理 (defun set-date() (interactive) (find-file (concat file-path "template.txt")) (rename (concat file-path file-name)) (mapcar (lambda(offset) (when (scan-buffer "{\\(.+?\\)}" :regexp t) (replace-match (my-format-date (calc-day date-reference offset) (match-string 1))))) '(0 6 0 1 2 3 4 5 6))) ;土、金、土、日、月、火、水、木、金
Lispの標準的なインデントや命名規則が微妙にわからん。template-insert.lでもできそうかと思ったけど日付をころころ変えるのができなさそう?できる?わからん。まー折角なので勉強かねて自作。もっと簡単にできる言語がある?もっと簡単にできるエディタがある?ですよね!もっとましな書き方がある?教えてくださいm(_ _)m