基本的に、言語には 3 つのリストと 3 つの固定長型があり、そのうちの 1 つは文字列です。正規表現を使用してトークンのタイプを検出するのは簡単ですが、それらをトークンに分割するのは簡単ではありません。
文字列は二重引用符で表記され、二重引用符はバックスラッシュでエスケープされます。
編集:
サンプルコード
{
print (sum (1 2 3 4))
if [( 2 + 3 ) < 6] : {print ("Smaller")}
}
のようなリスト
- () は、必要な場合にのみ評価される引数リストです。
- [] は、2 つのオペランド操作をよりきれいに表現するための特別なリストです。
- {} は常に評価されるリストです。最初の要素は関数名、2 番目の要素は引数のリストで、これが繰り返されます。
- any : anything [ : anything [: ...]] は、要素が :s で結合された引数リストに変換されます。これは、ループと条件の見栄えを良くするためだけのものです。
すべての関数は 1 つの引数を取ります。引数リストは、さらに必要な関数に使用できます。さまざまなタイプの eval 関数を使用して、引数リストを評価することができます。(リストモデルごとに評価関数があります)
したがって、これを理解すれば、これは Lisp と非常によく似た働きをし、コードを整形するためのリスト タイプが異なるだけです。
編集:@rici
[[2 + 3] < 6]
もOKです。前述したように、引数リストは必要な場合にのみ評価されます。<
は長さ 2 の引数リストを必要とする関数であるため、何らかの(2 + 3)
方法で評価する必要があります。他の方法では、が に等しく、が無効な引数リストに[(2 + 3) < 6]
変換されます。しかし、あなたが指摘したように、この場合の自動解析がどのように機能するかは自明ではありません。上で説明したバージョンは、 が次のような関数で引数リストを評価するというものですが、あなたは正しいと思います。そうする理由はありません。より良いコードにはつながらないからです。だからより良いコードです、私は同意します。< (2 + 3) : 6
< (2 + 3 6)
<
[...]
eval_as_oplist (...)
[...]
[[. . .] . .]