4

私はこれを作成しました

cloneset: :set
set: func[word [word!] value][
if/else (type? get word) = list! [
    print "list is immutable"
][

    cloneset word value
    protect word
]
]
protect 'cloneset
protect 'set

新しい set 関数を使用して val 関数を定義すると、次のエラーが発生します。

val: func[word [word!] value][
    set word value
    protect word
    value
]

>> val: func[word [word!] value][
[        set word value
[        protect word
[        value
[    ]
** Script Error: set has no refinement called any
** Where: throw-on-error
** Near: if error? set/any 'blk try

理由がわかりません。

4

3 に答える 3

6

で定義されている単語を再定義する場合は、正確にsystem/words再定義する必要があります。この単語には 2 つの改良点があります。また、再定義には次の要素も含める必要があります。set/pad/any

cloneset: :set
set: func [
    word [word! block!]
    value
    /any
    /pad
][
    either all [word? word list? get word] [
        throw make error! "List is immutable!"
    ][
        comment {
           At this point you'll have to forward the arguments and refinements
           of your SET method to CLONESET. This will be made much easier in R3
           with the new APPLY function.
        }
    ]
]

(上記のコードはまったくテストしていません。疑似コードと見なす必要があります。)

于 2009-07-20T20:46:45.453 に答える
3

仕様を確実に正しくするために、元の関数の仕様を再利用できます。

set: func spec-of :cloneset [
    'new-implementation
]

source set
set: func [
    {Sets a word, block of words, or object to specified value(s).} 
    word [any-word! block! object!] "Word or words to set" 
    value [any-type!] "Value or block of values" 
    /any "Allows setting words to any value." 
    /pad {For objects, if block is too short, remaining words are set to NONE.}
]['new-implementation]

'spec-of のない古いバージョンでは、代わりに 'first を使用できます。

于 2013-05-29T13:11:47.643 に答える
3

Rebol では、任意の組み込み関数をオーバーライドできます。set実際に上記の関数をオーバーライドしました。

ただし、取得したエラーが表示された場合は、throw-on-error関数を調べておく必要があります。set関数のソース コードには、次のような関数の呼び出しがあることがわかります。

set/any 'blk try ...

throw-on-errorこの呼び出しは、関数が変数を想定して、絞り込みsetを持つ関数を参照することを示唆しています。/any関数の再定義されたバージョンにはそのような改良がないため、throw-on-error関数はそれをそのように呼び出すことができず、エラーが発生しました。

一般的に言えば、何でも再定義できますが、特に再定義されたバージョンが元のバージョンと下位互換性がない場合は、再定義の責任を負う必要があります。

于 2013-05-30T00:48:22.797 に答える