Rebol级联 [英] Cascade in Rebol

查看:97
本文介绍了Rebol级联的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在徽标语言中, cascade 是多次编写一个函数(类似于功能语言中的fold).
示例:

In Logo Language, cascade is a procedure to to compose a function with itself several times (it is almost like fold in functional language).
Example:

   add 4 add 4 add 4 5  -->  cascade 3 [add 4 ?1] 5 ==  17
   2^8 -->  cascade 8 [?1 * 2] 1
   fibonacci 5 --> (cascade 5 [?1 + ?2] 1 [?1] 0)
   factorial 5 --> (cascade 5 [?1 * ?2] 1 [?2 + 1] 1)

多输入级联的通用符号,在徽标中:
(级联多少个function1 start1 function2 start2 ...)与:

General notation for multi-input cascade, in Logo:
(cascade how many function1 start1 function2 start2 ...) with:

function1 -> ?1 ,  
function2 -> ?2 ... 

级联返回最终值?1.

在Rebol中:

cascade1: func [howmany function1 start1] [....]      
cascade2: func [howmany function1 start1 function2 start2] [....]

如何在Rebol中编写级联1和级联2?

How to write cascade1 and cascade2 in Rebol ?

推荐答案

绑定,将单词绑定到指定的上下文(在本例中为函数的本地上下文),然后撰写函数,我得到:

With bind, that Binds words to a specified context (in this case local context of function), and compose function, I get:

cascade: func [  
    times
    template
    start 
] [
    use [?1] [
        ?1: start  
        template: compose [?1: (template)]  
        loop times bind template '?1  
        ?1
    ]  
]

cascade 8 [?1 * 2] 1
== 256
cascade 3 [add 4 ?1] 5
== 17  
val: 4
cascade 3 [add val ?1] 5
== 17



cascade2: func [
    times
    template1 start1
    template2 start2
    /local **temp**
] [
    use [?1 ?2] [ ; to bind only ?1 and ?2 and to avoid variable capture
        ?1: start1
        ?2: start2
        loop 
            times 
            bind 
                compose [**temp**: (template1) ?2: (template2) ?1: **temp**] 
                '?1
        ?1
    ]
]


 cascade2 5 [?1 * ?2] 1 [?2 + 1] 1
 == 120
 cascade2 5 [?1 + ?2] 1 [?1] 0
 == 8

这篇关于Rebol级联的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆