在Rebol中获取Object'Func with Refinement

时间:2009-12-16 16:13:01

标签: rebol

假设我有

o: context [

  f: func[message /refine message2][
    print [message] 
    if refine [print message 2]
  ]

]

我可以这样称呼它

do get in o 'f "hello"

但我怎样才能进行改进?像这样的东西可以起作用

>> do get in o 'f/refine "hello" "world"
** Script Error: in expected word argument of type: any-word
** Near: do get in o 'f/refine
>>

3 个答案:

答案 0 :(得分:2)

我不知道是否有办法直接告诉解释器在调用函数值时使用细化。当do的参数为function!时,这需要对>> fword: get in o 'f >> do compose [(to-path [fword refine]) "hello" "world"] hello world 进行一些参数化。似乎没有这样的东西......但也许它隐藏在其他地方。

我知道使用细化的唯一方法是使用路径。为了说清楚,我将首先使用一个临时词:

do [fword/refine "hello" "world"]

撰写之后第二个语句评估的是:

>> do compose [(to-path compose [(get in o 'f) refine]) "hello" "world"]
hello
world

您实际上也可以将函数值放入路径中。它摆脱了中间人的需要:

message

P.S。您在2message2之间有一个额外的空格,它应该只是{{1}}

答案 1 :(得分:1)

这样做:

o/('f)/refine "hello" "world"

如果路径表达式中的Parens对应于object对象或系列pick / poke索引引用,则会对其进行求值。这使得上面的代码等同于:

apply get in o 'f ["hello" true "world"]

请注意,apply参数是位置的,因此您需要知道参数的声明顺序。您无法使用函数优化本身来完成这一操作,因此您必须使用apply或创建路径表达式以评估是否要参数化函数调用的细化。

答案 2 :(得分:-1)

使用简单路径o / f / refine