kikkiiのブログ

ひきこもり

2018年12月25日火曜日(クリスマス)

今日はクリスマス。キリストの誕生日。つれづれなるままなのでキリスト教の『聖書』でも読んでみようと思った。

新約聖書の『マタイによる福音書』を開き、第1章から読みはじめる。家系図の組み立てキットみたいな文章からはじまってハードル高い。第1章には、イエス・キリストの誕生の次第が書いてあるようだ。

ただ読んだだけでは頭に残らず流れていくだけで読んだ気がしない。Graphvizを使って図にしてみた。分かりにくい図ができてしまったが、作ってしまったので、せっかくだから見せたい。

f:id:kikkii:20181225141037p:plain

普通に手で家系図を書いた方が読みやすいのが描けたと思う。この家系図は少し蛇 のようだ。これが私のクリスマスの成果。


上の図はGraphvizをそのまま書くのではなくDonutsGraphvizcommon lispで書けるツール)を使った。family-treeという名前の関数に『マタイによる福音書』第1章の内容を写経した。

(defun family-tree ()
  ($$ (& (:layout :dot)
       ;;1:1アブラハムの子であるダビデの子、イエス・キリストの系図。
       (-> "アブラハム" "ダビデ" :label "子")
       ;;1:2アブラハムはイサクの父であり、
       ;;イサクはヤコブの父、ヤコブはユダとその兄弟たちとの父、
       (-> "イサク" "アブラハム" :label "父")
       (-> "ヤコブ" "イサク" :label "父")
       (-> "ユダ" "ヤコブ" :label "父")
       ;;1:3ユダはタマルによるパレスとザラとの父、
       ;;パレスはエスロンの父、エスロンはアラムの父、
       (-> "パレス" "ユダ" :label "父")
       (-> "ザラ" "ユダ" :label "父")
       (-> "パレス" "タマル" :label "母")
       (-> "ザラ" "タマル" :label "母")
       (-> "エスロン" "パレス" :label "父")
       (-> "アラム" "エスロン" :label "父")
       ;;1:4アラムはアミナダブの父、
       ;;アミナダブはナアソンの父、ナアソンはサルモンの父、
       (-> "アミナダブ" "アラム" :label "父")
       (-> "ナアソン" "アミナダブ" :label "父")
       (-> "サルモン" "ナアソン" :label "父")
       ;;1:5サルモンはラハブによるボアズの父、
       ;;ボアズはルツによるオベデの父、オベデはエッサイの父、
       (-> "ボアズ" "サルモン" :label "父")
       (-> "ボアズ" "ラハブ" :label "母")
       (-> "オベデ" "ボアズ" :label "父")
       (-> "オベデ" "ルツ" :label "母")
       (-> "エッサイ" "オベデ" :label "父")
       ;;1:6エッサイはダビデ王の父であった。
       ;;ダビデはウリヤの妻によるソロモンの父であり、
       (-> "ダビデ王" "エッサイ" :label "父")
       (-> "ソロモン" "ダビデ王" :label "父")
       (-> "ソロモン" "ウリヤ" :label "母")
       ;;1:7ソロモンはレハベアムの父、
       ;;レハベアムはアビヤの父、アビヤはアサの父、
       (-> "レハベアム" "ソロモン" :label "父")
       (-> "アビヤ" "レハベアム" :label "父")
       (-> "アサ" "アビヤ" :label "父")
       ;;1:8アサはヨサパテの父、
       ;;ヨサパテはヨラムの父、ヨラムはウジヤの父、
       (-> "ヨサパテ" "アサ" :label "父")
       (-> "ヨラム" "ヨサパテ" :label "父")
       (-> "ウジヤ" "ヨラム" :label "父")
       ;;1:9ウジヤはヨタムの父、
       ;;ヨタムはアハズの父、アハズはヒゼキヤの父、
       (-> "ヨタム" "ウジヤ" :label "父")
       (-> "アハズ" "ヨタム" :label "父")
       (-> "ヒゼキヤ" "アハズ" :label "父")
       ;;1:10ヒゼキヤはマナセの父、
       ;;マナセはアモンの父、アモンはヨシヤの父、
       (-> "マナセ" "ヒゼキヤ" :label "父")
       (-> "アモン" "マナセ" :label "父")
       (-> "ヨシヤ" "アモン" :label "父")
       ;;1:11ヨシヤはバビロンへ移されたころ、
       ;;エコニヤとその兄弟たちとの父となった。 
       (-> "エコニヤ" "ヨシヤ" :label "父")
       ;;1:12バビロンへ移されたのち、エコニヤはサラテルの父となった。
       ;;サラテルはゾロバベルの父、
       (-> "サラテル" "エコニヤ" :label "父")
       (-> "ゾロバベル" "サラテル" :label "父")
       ;;1:13ゾロバベルはアビウデの父、
       ;;アビウデはエリヤキムの父、エリヤキムはアゾルの父、
       (-> "アビウデ" "ゾロバベル" :label "父")
       (-> "エリヤキム" "アビウデ" :label "父")
       (-> "アゾル" "エリヤキム" :label "父")
       ;;1:14アゾルはサドクの父、
       ;;サドクはアキムの父、アキムはエリウデの父、
       (-> "サドク" "アゾル" :label "父")
       (-> "アキム" "サドク" :label "父")
       (-> "エリウデ" "アキム" :label "父")
       ;;1:15エリウデはエレアザルの父、
       ;;エレアザルはマタンの父、マタンはヤコブの父、 
       (-> "エレアザル" "エリウデ" :label "父")
       (-> "マタン" "エレアザル" :label "父")
       (-> "ヤコブ" "マタン" :label "父")
       ;;1:16ヤコブはマリヤの夫ヨセフの父であった。
       ;;このマリヤからキリストといわれるイエスがお生れになった。 
       (-> "ヨセフ" "ヤコブ" :label "父")
       (-> "マリヤ" "ヨセフ" :label "夫")
       (-> "マリヤ" (<> "イエス・キリスト" :color :red) :label "子"))))

REPLで使う。

CL-USER> (ql:quickload :donuts)

CL-USER> (in-package :donuts)

;;上の関数 family-tree を読み込んでから
DONUTS> (family-tree)

関数family-treeの2行めの(:layout :dot)の部分の:dot:neatoとか:fdpとか:sfdpとか:twopiとか:circoとかに書き換えるとレイアウトを変更できる。


(:layout :fdp)

f:id:kikkii:20181225142253p:plain


(:layout :neato)

f:id:kikkii:20181225142227p:plain