Hi all,

I changed the implementation of Tail-func to support the THROW attribute:

tail-func: function [
    {Creates a tail-recursive function.}
    [catch]
    spec [block!] body [block!]
] [
    ic icb i item locals result does-body
] [
    use [new-locals stop] [
        stop: false
        locals: copy []
        icb: copy []
        i: 1
        parse spec [
            any [
                set item any-word! (
                    append locals to word! :item
                    append icb compose [
                        error? set/any pick new-locals (i) get/any pick
locals (i)
                    ]
                    i: i + 1
                ) | skip
            ]
        ]
        set [new-locals body] use locals copy/deep reduce [
            reduce [locals body]
        ]
        use [finish] [
            does-body: has [ret] compose [
                finish: [return get/any 'result]
                set/any 'ret do (reduce [body])
                finish: [get/any 'result]
                get/any 'ret
            ]
            append icb compose/deep [
                either stop [
                    stop: false
                ] [
                    until [
                        stop: true
                        error? set/any 'result (:does-body)
                        stop
                    ]
                    stop: false
                    do finish
                ]
            ]
        ]
        ic: func [
            {do body with locals in new context}
            [throw]
            locals
        ] icb
        throw-on-error [
            func spec reduce [:ic locals]
        ]
    ]
]


-- 
To unsubscribe from this list, please send an email to
[EMAIL PROTECTED] with "unsubscribe" in the 
subject, without the quotes.

Reply via email to