0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PythonでのLispのシンボルの表現

Last updated at Posted at 2024-12-17

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重のクオートが出来ます。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?