symbolの表現
pythonでのシンボルの表現は、こんな風にします。
>>> a="print('AAA')"
>>> b="print('BB')"
>>> c="print('C')"
>>> l=['a','b','c']
>>> for x in l:
... exec(eval(x))
...
AAA
BB
C
>>>
変数a,b,cがシンボルに当たります。eval()関数で変数xに含まれる'a'という文字列をpythonの変数として扱い、その値を取ってきて、(一段深く評価)、exec()関数で、aの値を実行です。'b'も、'c'も同様です。
pythonではlispのように、eval(3)の値が3になったりはしません。eval(3)はエラーになります。なので、厳密にはpythonではlispのようにatomは扱えません。
LISPでは以下のようになります。
[1]> (setq a 'a)
A
[2]> (setq b 'a)
A
[3]> a
A
[4]> b
A
[5]>
[1]> (setq a 3)
3
[2]> (setq b 'a)
A
[3]> a
3
[4]> b
A
[5]>
これをpythonでやると以下のようになります。
>>> a='a'
>>> b='a'
>>> a
'a'
>>> b
'a'
>>> a=3
>>> b='a'
>>> a
3
>>> b
'a'
lispでも、(eval a)で、aが未定義だとエラーになります。
pythonは色々と書きやすいけど、インデントがどうもやりにくいです。インデントの代わりに、コードブロックを括弧で括るようになったら最強かも知れません。
car,cdr
Pythonで、LISPのcar,cdrを完全に表現する方法はありません。pythonのlistの構造が、LISPの連結リストと違うからです。LISPのコンスセルのように、car部とcdr部が双方ともatomを指したり、コンスセルを指したりすることはできません。しかし、以下のようにlistのcar,cdrを表現することが出来ます。
list[0] # car list先頭要素へのアクセス
list[1:] # cdr 残りのlist
Pythonでコンスセルを直接扱うことは、一般的ではありません。
pythonでもatomとコンスセルを扱えるようになればいいのに
クォート
pythonでの、クォートは以下のようにします。
>>> a='"3"'
>>> eval(eval(a))
3
>>> eval(a)
'3'
>>> a
'"3"'
>>>
'
,"
を\
でエスケープすることによって、n重のクオートが出来ます。