* [2022-10-30 日]
((☼→☁ . 晴れ 夜 くもり) (☼☁ . 晴れ 朝晩 くもり) (☁→☔ . くもり 後 一時 雨))

** 木を切る :forestry:
今日は朝集落の集まりに行ってから、
家の周囲の木を切る。特に裏山。
2時間くらい切ったけど、まだまだある。
チェーンソーがほしい。
ブリ縄もやりたいけど、今日は時間なし。

** substとsublis :lisp:
changelogを見ると先日10月20日頃、
substとsublisという記事を読んで、
文字列置換ではなく、シンボル置換の標準関数が
あるという事を知った。

知ったというか、既にいろんなところで見ていたにも
関わらず、使ってないからすっかりその存在を忘れていた。

cltl2なんか1000ページくらいあるし、仕様がでかい。

気付かなかったもう1つの理由はググって逆引きで
調べてたから。逆引き便利だけど、別に全て網羅
している訳じゃなさそうだし。

hyperspecは逆引きみたいには使わないしなぁ。。。

なんかうまいやり方あればいいんだけど。

とりあえず、今日は初めての人のためのLispを
改めて見てたらそのsubstの定義が出てきた。

#+BEGIN_SRC lisp
  (defun subst (new old tree)
    (cond ((eq old tree) new)
          ((atom tree) tree)
          (t (cons (subst new old (car tree))
                   (subst new old (cdr tree))))))

  (subst 'fuga 'hoge '(hoge hoge hogeo))  ; =>(FUGA FUGA HOGEO) 
#+END_SRC

うーん、美しいなぁ。

自分の書いた文字列置換は

#+BEGIN_SRC lisp
  (defun scan (key obj)
    (let ((key-len (length key))
          (start (search key obj)))
      (values start (+ start key-len))))  ; =>SCAN 
      
  (defun %s (old new obj)
    (let ((old-len (length old)) 
          (start (search old obj))) 
      (concatenate 'string (subseq obj 0 start) new
                   (let ((rest (subseq obj (+ start old-len))))
                     (if (< old-len (length rest))
                         (%s old new rest)
                         rest)))))        ; =>%S 
#+END_SRC

うーん、ダサい。美しくない。

初めての人のためのLisp本って今日のlisp teatimeでも
話したけど、会話形式で本の密度が薄い感じがしたんだよね、最初は。

でも、Lispの基本関数というのかな?
atom,eq,car,cdr,cons
(この5つにcltl2(p.373)曰く、rplacaとrplacdが当初の
7つの基本演算子らしい。)

こういったのにcondとか再帰とか結構原始的な方法を
使って書く訓練をしていたように感じる。

そんなにまだ身についてない気はしているけど。

また、substが出てきた。p160
#+BEGIN_SRC lisp
  (defun subst (new old tree)
    (cond ((eq old tree) new)
          ((atom tree) tree)
          (t (let ((a (subst new old (car treee)))
                   (d (subst new old (cdr tree))))
               (cond ((and (eq a (car tree))
                           (eq d (cdr tree)))
                      tree)
                     (t (cons a d)))))))
#+END_SRC

部分リストがどうのこうの書いてあるけど、
ちょっともう頭が働かないので、今日はここまで。