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에서는 메 자닌 기능이 적용됩니다.
>> 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
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다