возможно ли иметь статическую переменную внутри функции реболя? - PullRequest
1 голос
/ 19 мая 2010

Это показывает, как иметь статическую переменную внутри объекта или контекста: http://www.mail-archive.com/list@rebol.com/msg04764.html

Но область действия слишком велика для некоторых нужд, возможно ли иметь статическую переменную внутри функции объекта?

Ответы [ 2 ]

3 голосов
/ 17 июля 2010

Или вы можете использовать FUNCTION/WITH. Это заставляет генератор функций принимать третий параметр, который определяет постоянный объект, который используется как "self" :

accumulate: function/with [value /reset] [
    accumulator: either reset [
        value
    ] [
        accumulator + value
    ]
] [
    accumulator: 0
]

Чтобы использовать это:

>> accumulate 10
== 10

>> accumulate 20
== 30

>> accumulate/reset 0
== 0

>> accumulate 3
== 3

>> accumulate 4
== 7

Вы также можете посмотреть моя функция FUNCS .

2 голосов
/ 19 мая 2010

В Rebol 3 используйте замыкание (или CLOS) вместо функции (или FUNC).

В Rebol 2 имитируйте его, имея блок, содержащий ваши статические значения, например:

f: func [
   /local sb
][
     ;; define and initialise the static block
 sb: [] if 0 = length? sb [append sb 0]

     ;; demonstate its value persists across calls
 sb/1: sb/1 + 1
 print sb
 ]

    ;; sample code to demonstrate function
 loop 5 [f]
 == 1
 == 2
 == 3
 == 4
 == 5
...