2012-01-07 2 views
1

주어진 함수를 매개 변수로 제공하는 함수로 주어진 목록을 분할하는 체계에서 함수를 구현하려고합니다. 예시하려면Scheme에서 매개 변수를 전달하는 비정상적인 방법

(splitby '("a" "b" "cc" "ab" "abc" "a" "b") 
     (lambda (x y) (= (string-length x) (string-length y)))) 

내가 무엇을해야 이러한 기능을 구현하는 동안 나는 매개 변수이 '와 같은 기능은'작동 방법을 이해하는 것이 정말 어렵다, 그래서 계획 꽤 초보자 해요, 그리고 (("a" "b") ("cc "ab") ("abc") ("a" "b"))

를 반환해야 ? 반응식

답변

1

함수는이 경우에 따라서 등 번호 문자열과 같은 객체가, 사용자의 예는 다음과 동등하다 :

(define (equal-length x y) 
    (= (string-length x) (string-length y))) 

(splitby '("a" "b" "cc" "ab" "abc" "a" "b") equal-length) 
함수의 사용은 분할 기준을 정의 할 수 있도록하는 것이다

. 이 경우 주어진 함수가 true 값을 반환하는 한 항목은 동일한 그룹에 있습니다. 그렇지 않으면 새 그룹이 만들어집니다.

그룹 요소를 함께 동일 것을하는 group-equal 함수를 작성, 시작하려면 :

(define (group-equal lst) 
    ...) 

경우, 예를 들어,

(group-equal '(1 2 2 3 3 3 4)) 

반환

((1) (2 2) (3 3 3) (4)) 

을 성공적으로 구현하는 경우 그 다음에는 splitby functio와 동일합니다. n을 제외하고 equal? (예 : 이 사용할 수 있음) 대신 주어진 함수 (equal-length)를 사용한다는 점을 제외하고는 n을 사용합니다.

+0

감사합니다. 정말 도움이되는 대답이었습니다. –

1

먼저 Scheme에서 모든 것은 괄호 안에 있습니다. 당신이 값 xy에 기능 f을 적용 할 경우 그래서, 당신은 쓰기 :

(f x y) 

그래서 당신은 단순히 괄호의 첫 번째 세트 안에 splitby을 넣어해야합니다.

두 번째로 데이터를 전달하는 것처럼 함수를 값으로 다른 함수로 전달할 수 있습니다.

(define (double x) 
    (* x 2)) 
내가 인수로 double 소요 다른 기능을 쓸 수 있습니다

:

(define (change_result f x) 
    (f (+ 3 x))) 

; (change_result double 6) returns 18 
내가 람다를 사용하는 경우 나 또한, 같은 방법으로이 작업을 수행 할 수 있습니다

(
그래서 나는 기능이있는 경우 익명) 기능 :

(change_result (lambda (x) (* 3 x)) 10) 
+0

's/change_result/change-result/g'입니다. Lisp 스타일에서 식별자는 하이픈을 사용하여 밑줄이 아닌 단어를 구분합니다. 참조 : http://mumble.net/~campbell/scheme/style.txt –

+0

"기호 이름은 하이픈으로 분리 된 영문 단어로 작성됩니다 Scheme과 Common Lisp은 모두 프로그램에서 이름의 대소 문자를 구별합니다 결과적으로 낙타의 경우 눈살을 찌푸리게하고 있습니다. 왜냐하면 그것은 단지 ugly이기 때문 만이 아닙니다.밑줄은 이 번역없이 외국어에서 직접 파생 된 이름을 제외하고 용납 할 수없는 구분 기호입니다. " –

+0

@ ChrisJester-Young - 정보 주셔서 감사합니다."의 대소 문자 "는 무엇을 의미합니까? source. – amindfv

관련 문제