2

Rebol 3にはFUNCTIONの新しい実装があり、デフォルトで変数をローカルコンテキストに自動的にバインドできます。

FUNCTIONにVALUEに問題があるようです。実行時に変数がまだ設定されていない場合でもTRUEを返すため、テストします。

foo: function [] [
    if value? 'bar [
        print [{Before assignment, bar has a value, and it is} bar]
    ]

    bar: 10

    if value? 'bar [
        print [{After assignment, bar has a value, and it is} bar]
    ]
]

FOOに電話すると、次のようになります。

Before assignment, bar has a value, and it is none
After assignment, bar has a value, and it is 10

これはFUNCの動作方法ではありません(割り当て後にBARに値があるとだけ表示されます)。ただし、FUNCは変数を自動的にローカルにしません。

ここで、LadislavMecirによって作成されたライブラリでFUNCSプリミティブを見つけました。それはどのように異なり、同じ欠点がありますか?

http://www.fm.vslib.cz/~ladislav/rebol/funcs.r

4

1 に答える 1

3

主な違いは、FUNCTION は本体内の集合語を深く検索するのに対し、FUNCS は単にそれらを浅く検索することです。FUNCS も若干異なる仕様を採用しています。

FUNCS はかなり前から存在しています (名前の変更は少し前に行われましたが)。

その価値?function "problem" は、関数のローカル変数 (FUNC を /LOCAL と共に使用して明示的に宣言した場合でも) が NONE に初期化されるという事実に関連しています。それが VALUE? の原因です。変数が「まだ初期化されていない」場合でもTRUEを返す関数。

一般に、これが「NONE で初期化された」ことを「大したこと」だとは思いませんが、この動作はグローバル変数またはオブジェクト変数の動作と同じではありません。

于 2010-07-17T11:09:11.283 に答える