【问题标题】:Creating map function in Red language用 Red 语言创建地图函数
【发布时间】:2017-10-15 08:17:41
【问题描述】:

如何用红色语言创建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

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

【问题讨论】:

    标签: higher-order-functions rebol red


    【解决方案1】:

    在 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
    

    【讨论】:

    • 我改变了答案。 reversetrim 在原始系列上工作并进行更改。所以你必须使用你工作的系列的副本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多