2017-10-15 6 views
0

上位言語の言語である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 

しかし、それは動作していません - 元のブロックを変更したりエラーメッセージを返すだけで元のブロックに戻します。どのようにこれを修正することができますか?あなたはメザニン機能ソースがを適用するを参照してください

>> 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 

を適用していREBOLので

答えて

0

限り、赤はあなたが持つ関数を取得独自のマッピング機能など

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 
+0

なぜトリムも見せている反転した文字列を変更したくない場合、この関数は、この方法を呼び出しますか? – rnso

+0

私は答えを変えました。 **逆**と**トリム**元のシリーズで動作し、それを変更します。したがって、あなたが作業しているシリーズのコピーを使用する必要があります。 – sqlab

関連する問題