サーチ…


S-Expression

Schemeの式が実行されます。通常、呼び出されるS式はaで始まり(そしてaで終わります) 。式の最初のメンバーは実行されるものです。次の式のメンバーは、式の評価中に式に送信されるパラメーターです。

たとえば、数字を追加する:

(+ 1 2 3)

この場合、 +は複数のパラメータを取るadd関数のシンボルです。 12及び3に送信される+機能。

S-Expressionは、次の例に示すように、S-Expressionsをパラメータとして含むことができます。

(if (< x y)
  x
  y)

どちらかのように読み取ることができx未満であるyリターンx他に戻りy 。この例では、解決された値に応じて条件式を評価し、xまたはyが返されます。それはこれに評価することができた

(if #t x y)
x
(if #f x y)
y

初心者のためのあまり分かりにくい例は、S-ExpressionをS-Expressionの最初のメンバーの一部として持つことです。このようにして、同じパラメータを持つブランチを作成しなくても呼び出される関数を変更することで、メソッドの動作を変更できます。ここでは、xがyよりも小さい場合に数値を加算または減算する式の簡単な例を示します。

((if (< x y) + -) 
  1 2 3)

xy場合、式は次のように評価されます。

(+ 1 2 3)
6

さもないと

(- 1 2 3)
-4

ご覧のように、Schemeを使うとプログラマーは複雑なコードを構築し、プログラマーはコードの重複を防ぐことができます。他の言語では、次のように書かれた同じ例を見ることができます:

(if(<xy)(+ 1 2 3)( - 1 2 3))

このメソッドの問題は、多くのコードを複製する一方、変更されるのはメソッドが呼び出されることだけです。この例はかなりシンプルですが、より多くの状態では、同様の行が重複していることが分かりました。

シンプルなマクロ

schemeのlet式は実際にはマクロです。彼らはラムダで表現することができます。単純なletは次のようになります。

(let ((x 1) (y 2))
  (+ x y))

let本体の最後の式の値が返されると3を返します。ご覧のとおり、let式は実際に何かを実行しています。このコード部分をlambdaで翻訳すると、次のようなものが得られます。

((lambda (x y) (+ x y)) 1 2)

ここでは、匿名のラムダを1と2で直接呼び出すことがわかります。したがってこの場合の結果も3です。

そのことを念頭に置いて、let式は2つの部分で構成されていることを理解しています。それはラムダのようにパラメータとボディを持っていますが、違いはlet式が評価の直後に呼び出されることです。

let式が抽象的なビューから具体的なビューにどのように作用するかを説明するために、このようになります。

(let params body ...)
(let (param1 param2 ...) body ...)
(let ((p1 val1) (p2 val2) ...) body ...)

パラメータは、 let本体で使用される(name value)ペアのリストです。

なぜlet式を使うのですか?

式は、言語のような変数の初期化のように、変数をメソッドに格納するのに特に便利です。 let式から変数がなくなったので、 define使うのが有利です... defineを使うと、実際には現在の実行環境に変数が追加されています。グローバル環境に追加された変数は削除できません。表現はどこでも安全に使えるようにしましょう。また、親スコープに触れることなくゴースト変数に使用することもできます。

例えば:

(let ((x 1))
  (let ((x 2) (y x))
    (display x)
    (display y))
  (display x))

それは印刷されます:

2
1
1

この場合、 xは1で定義され、2番目のlet xによって値2でゴーストされます。変数yは、親スコープの値xで開始されます。内側のlet式が実行された後、 xの初期値が1で表示されます。内側のlet式は親スコープの値を変更しませんでした。

変数を初期化する必要があるときは、let式を次のように使用する必要があります。

(let (
  (user (get-current-user session))
  (db (get-current-db session))
  (ids (get-active-ids session))
  )
  (mark-task-completed db user ids)
  (change-last-logged db user)
  (db-commit db))

この例では、変数は初期化され、コードブロック内で複数回使用されます。 let式が終了すると、変数はもはや必要なくなるので自動的に解放されます。

ペアのドット付き構文

consコンストラクタを使うよりもコンパクトな方法でconsを書くことができる特定の構文があります。

ペアは次のように記述できます。

'(1 . 2) == (cons 1 2)

大きな違いは、引用符を使用してpairsを作成できることです。それ以外の場合、Schemeは適切なリスト(1 . (2 . '()))ます。

ドット構文は、式に2つのメンバーしか持たないように強制します。各メンバーは、ペアを含む任意のタイプであり得る。

'(1 . (2 . (3 . 4)))
> (1 2 3 . 4)

リストの最後のペアのcdrが空のリスト'()はないことを示すために、不適切なリストに最後にドットを表示する必要があることに注意してください。

リストを表示するこの方法は、次の式が期待するように表現されないため、時折混乱します。

'((1 . 2) . ( 3 . 4))
> ((1 . 2) 3 . 4)

リストは通常​​、スキップし.リストの最初の引数は(1 . 2) 1.2 (1 . 2)であり、2番目の引数は3が、リストは不適切であるため、最後の引数は最後のもの.リストの最後の要素が'()はないことを示しています。たとえ考えても、データは別の方法で表示され、内部データは作成時と同じです。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow