【问题标题】:Rebol calc-workdays not working on RedRebol calc-workdays 不适用于 Red
【发布时间】:2017-11-16 18:42:36
【问题描述】:

我试图以红色执行此脚本https://www.mail-archive.com/rebol-bounce@rebol.com/msg01222.html,但我不明白为什么会得到

现在计算工作日/日期 2007 年 2 月 3 日 [2007 年 2 月 1 日]

*** 脚本错误:> 运算符缺少参数

*** 地点:做

*** 堆栈:打印计算工作日

    found?: func [
        "Returns TRUE if value is not NONE."
        value
    ][
        not none? :value
    ]

    calc-workdays: func [
        "Return number of workdays between two dates, excluding holidays"
        date1 [date!] "Start date"
        date2 [date!] "End date"
        holidays [block!] "Block of dates to exclude (holidays, etc.)"
        /non "Return number of non-work days (weekend + holidays) between 2 dates"
        /local days day1 day2 diff param
    ][
        days: copy []
        set [day1 day2] sort reduce [date1 date2]
        diff: day2 - day1
        param: pick [[> 5 union][< 6 exclude]] either found? non [1][2]
        loop diff [
            day1: day1 + 1
            if do param/1 day1/weekday param/2 [append days day1]
        ]
        return length? do param/3 days holidays
    ]

【问题讨论】:

    标签: rebol red


    【解决方案1】:

    Rebol2 似乎可以让你传递一个 WORD!去做,并评估它。如果这个词恰好是一个持有 ANY-FUNCTION! 的变量,它将被运行......如果它是一个中缀“OP!”那么它将像 不是 中缀一样运行。

    >> do quote > 1 2
    == false
    
    >> do quote < 1 2
    == true
    

    Red 也可以这样做,但 DO 不是可变参数。它只能运行0个ar​​ity函数:

    >> foo: does [print "hi"]
    
    >> do quote foo
    hi    
    
    >> bar: func [x] [print x]
    
    >> do quote bar "hi"
    *** Script Error: bar is missing its x argument
    

    有问题的脚本试图使用此功能。但它可以用普通的 COMPOSE 或 REDUCE 来完成。所以改变:

    if do param/1 day1/weekday param/2 [append days day1]
    

    收件人:

    if do reduce [day1/weekday param/1 param/2] [append days day1]
    

    这将在 &gt;&lt; 运算符位于中间的位置构建一个代码块,并正常执行它而不依赖 DO 的这个 WORD!-dispatch 或中缀删除行为。

    同样,改变:

    return length? do param/3 days holidays
    

    收件人:

    return length? do reduce [param/3 days holidays]
    

    通过这些更改,并删除 found?(没有必要),它似乎可以工作。

    【讨论】:

    • 注意:在 Rebol3/Ren-C 中有一个 construct called EVAL,它可以让你完成 DO 正在做的事情......除非你需要使用 GET-WORD!从单词中提取函数,例如eval :param/1 day1/weekday param/2。 DO 原语和 Red 的一样,只接受 0 元函数。
    猜你喜欢
    • 1970-01-01
    • 2015-01-08
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多