그러한 절차가 Scheme 표준에 존재합니까? 그렇다면 어떻게 호출됩니까?

StackOverflow https://stackoverflow.com/questions/98394

  •  01-07-2019
  •  | 
  •  

문제

나는 프로시저의 트리 구조를 데이터의 트리 구조에 적용하여 결과의 ​​트리 구조를 생성하는 프로시저의 이름을 찾았습니다. 세 트리 모두 동일한 구조를 가졌습니다.

이러한 프로시저에는 다음과 같은 서명이 있을 수 있습니다.

(map-tree data functree)

반환 값은 해당 데이터 요소에 functree 요소를 요소별로 적용한 결과입니다.

예(프로시저를 맵 트리라고 가정):

예시 1:

(define *2 (lambda (x) (* 2 x)))
; and similar definitions for *3 and *5

(map-tree '(100 (10 1)) '(*2 (*3 *5)))

결과가 나오겠지

(200 (30 5))

예시 2:

(map-tree '(((aa . ab) (bb . bc)) (cc . (cd . ce)))
        '((car cdr) cadr))

결과가 나온다

((aa bc) cd)

그러나 제가 참고한 SLIB 문서에서는 그러한 기능을 찾지 못했습니다.

그런 절차가 이미 존재하나요?
그렇지 않은 경우 프로시저에 적합한 이름은 무엇이며 인수의 순서는 어떻게 됩니까?

도움이 되었습니까?

해결책

함수에 대한 좋은 이름이 없습니다.아래에 구현 내용을 붙여넣고 있습니다. map-traversing;다른 사람들은 더 나은 이름을 제안해야 합니다).나는 인수 순서를 다음과 같이 만들었습니다. map 그 자체.

(define (map-traversing func data)
  (if (list? func)
      (map map-traversing func data)
      (func data)))

샘플 데이터를 사용하여 다음을 얻었습니다.

(map-traversing `((,car ,cdr) ,cadr) '(((aa . ab) (bb . bc)) (cc cd . ce)))

두 번째 샘플에는 SRFI 26이 필요합니다.(글쓰기를 허용합니다. (cut * 2 <>) 대신에 (lambda (x) (* 2 x)).)

(map-traversing `(,(cut * 2 <>) (,(cut * 3 <>) ,(cut * 5 <>))) '(100 (10 1)))

가장 중요한 것은 예제와 달리 함수를 모두 인용해제해야 한다는 것입니다.

다른 팁

지도 탐색에 대한 다음 정의를 사용하면 함수의 인용을 해제할 필요가 없다는 것을 알았습니다.

(define (map-traversing func data)
  (if (list? func)
      (map map-traversing func data)
      (apply (eval func (interaction-environment)) (list data))))

메모:내가 설치한 Guile 버전에서는 어떤 이유로든 (interaction-environment)에서만 Unbound 변수 오류가 발생하지 않습니다.다른 환경, 즉(scheme-report-environment 5) 및 (null-environment 5)에서 이 오류가 발생합니다.

노트 2:그 후 [1]에서 (scheme-report-environment 5) 및 (null-environment 5)가 작동하려면 먼저 (use-modules (ice-9 r5rs))를 수행해야 함을 발견했습니다.

[1]: http://www.mail-archive.com/bug-guile@gnu.org/msg04368.html '답장:guile -c "(scheme-report-environment 5)" ==> 오류:바인딩되지 않은 변수:구성표-보고-환경'

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top