用 Red 语言创建地图函数

Creating map function in Red language

如何用 Red 语言创建 map 高阶函数。它应该将一个块和一个函数作为参数,并将发送的函数应用于块的每个成员。我尝试了以下代码:

Red []
mapfn: function[blk sfn][
    outblk: copy []
    foreach i blk[
        append outblk (sfn i) ]
    outblk ]

; to test: 
myblk: [" this " " is   " " a "  "    line " "for" "   testing " " only   "]
probe mapfn myblk 'reverse 
probe mapfn myblk 'trim

但它不起作用 - 它只是发回原始块而不更改它或给出任何错误消息。如何纠正?

在 Rebol 中你有夹层函数 apply

>> help apply
USAGE:
    APPLY func block /only 

DESCRIPTION:
     Apply a function to a reduced block of arguments.
     APPLY is a function value.

ARGUMENTS:
     func -- Function value to apply (Type: any-function)
     block -- Block of args, reduced first (unless /only) (Type: block)

REFINEMENTS:
     /only -- Use arg values as-is, do not reduce the block

(SPECIAL ATTRIBUTES)
     throw

参见来源应用

只要 Red 没有本地应用,你就可以编写自己的映射函数,例如

mapfn: function[blk sfn][
    outblk: copy []
    foreach i blk[
        append outblk sfn copy i 
    ]
    outblk 
]

通过:functionname

获取函数
>> myblk: [" this " " is   " " a "  "    line " "for" "   testing " " only   "]
== [" this " " is   " " a " "    line " "for" "   testing " " only   "]
>> probe mapfn myblk :reverse 
[" siht " "   si " " a " " enil    " "rof" " gnitset   " "   ylno "]
== [" siht " "   si " " a " " enil    " "rof" " gnitset   " "   ylno "]
>> probe mapfn myblk :trim
["this" "is" "a" "line" "for" "testing" "only"]
== ["this" "is" "a" "line" "for" "testing" "only"]
>> 

另一种更好的方法,因为您无法复制所有数据类型,例如

mapfn: function[blk sfn][
    collect [
        foreach i blk[
            keep sfn i 
        ]
    ]
]

如果没有不想修改原来的就这样调用函数

mapfn newblk: copy/deep myblk :reverse