2009-06-12 8 views
1

스키마에서 목록을 통해 이동하거나 목록에서 요소를 가져 오는 방법은 무엇입니까?스키마에서 목록 가져 오기

목록에서 자바의 변수에 대해하는 것처럼 각 요소의 이름을 어떻게 지정할 수 있습니까?

미리 감사드립니다.

목록의 모든 지점을 다른 지점과 비교하고 싶습니다. 그래서 우리가 java 또는 python으로 할 때 -

for(int i;i<list.size();i++){ 
    if (list[i]> k){ 
     //do something 
    } 

} 

어떻게 구성표에서 비슷한 작업을 수행 할 수 있습니까?

+0

질문을 이해할 수 없습니까? 목록의 각 값의 이름을 지정 하시겠습니까? – Jonas

+0

귀하의 답변에 대해 Jonas에게 감사드립니다. 나는 그 질문을 편집했다. 그것을 확인하십시오. – fireball003

답변

0

예이 경우

`(define func 
    (lambda (a b) 
    (if (> a b) 
     (dosomething a))))` 

는 "해봐요"미리 정의 된 여부를하거나, 다른 정의 될 것이다. 정의는 예를 들어 square() 또는 mult()와 같이 "함수"와 유사하다고 가정 해 봅시다. ,

(define (func list) (if (> (car list) k) (dosomething)) (func (cdr list)))

당신은 또한이 정의를 쓸 수있는 목록을 포함하고 첫 번째 예제로 전송하고 결과를 반환 하나를 가지고 :

나는 목록을 위해 일해야이 같은 재귀 일이 필요하다고 생각 비교, 무언가를하거나하지 말고 계속하십시오.

+0

하지만 목록은 어디 있습니까? 목록의 각 요소를 하나씩 비교해야합니다. 그러나 여기에서는 단지 2 개의 값이 비교되는 것 같습니다. 내 주요 문제는 목록에서 요소를 가져 오는 것입니다 (우리가 java list [i]에서하는 것처럼). 그렇게하는 방법? – fireball003

5
(map (lambda (x) (if (< x k) (dosomething x) x)) list) 
2

당신은 for-each를 사용할 수 있습니다

 
    (let ((a-list (list 9 2 7 6 1 4 3 8 1)) 
      (k 4) 
      (something display)) 
     (for-each (lambda (i) ; The 'name' of the list element is i 
        (if (> i k) 
         (something i) ; Do something with i 
         #f)) ; Do nothing 
       a-list)) 

for-eachmap 유사하지만 반환 값은 지정되지 않습니다. 부작용 만이 필요합니다.

Java 배경에서 오는 스키마를 배우고있는 것처럼 보입니다 (괜찮습니다). 스킴 프로그램은 종종 자바와 다른 스타일로 작성됩니다. Scheme은 기능적 언어이며 루핑 구문은 자주 사용되지 않습니다. Scheme에 대한 책을 선택하십시오 (예 : The Scheme Programming Language 또는 How to Design Programs). "Scheme way"프로그램을 작성하는 방법을 배우려면

+0

Jonas에게 다시 한번 감사드립니다. 네, 자바를 광범위하게 배우고 다음 C와 파이썬을 배웠습니다. 모든 호스 언어는 체계가 완전히 다른 반면 패턴은 다소 차이가 있습니다. 그래서, 다른 프로그래밍 연습에서 온 사람들에게 친숙하지 않은 계획의 의사입니다. 그러나 나는이 비행 연습을 떠나고 책을 따라갈 것입니다. – fireball003

4

leppie와 Jonas가 Scheme의 목록에 대해 반복적 인 답을 제공합니다. 그러나 목록에서 단일 값을 가져와야하는 경우 list-ref을 사용하십시오.

(let ((l '(1 2 3 4))) 
    (list-ref l 2)) 

=> 3 

당신은 그것의 인덱스 목록에서 값을 꺼내 list-ref를 사용할 수있는 Java 코드

int[] l = new int[] { 1, 2, 3, 4 }; 
return l[2]; 
0

에 대부분 동일합니다. 그러나 Scheme 목록은 실제로 링크 된 목록입니다. 따라서 (list-ref l 100)은 100 개의 참조를 추적해야합니다. 정말로 랜덤 액세스 값을 원하면 벡터를 사용하십시오.

2

기능적 언어로 작성하는 경우 다르게 생각해야합니다. 실제로 프로그래밍 사고 (for 루프 등)를 잊어 버리고 원하는 것을 정의하십시오. 예를 들어 "내 목록의 모든 홀수에 대해 조치를 적용하고 싶습니다." 그래서 당신이 쓰는 것입니다 : 내가 만약 확실하지 않다

> (map number->string 
     (filter higher-than-four? my-list)) 
("5" "6" "7" "8" "9" "10") 
0

:

(map an-action 
    (filter odd? my-list)) 

또는 조건이 액션 요소> 4

(define (higher-than-four? n) (> n 4)) 
(map an-action 
    (filter higher-than-four? 
      my-list)) 

할 수있다, 당신은 어떤 기능을 제공 이게 네가 원하는거야.하지만 이것은 전체 목록 (연결)으로 이동하여 각 요소를 매개 변수로 전달하는 요소와 비교한다.

(define (compare aList element) 
     (if (> element (car aList)) 
     (display (car aList)) ;here do something great 
     ;here the else if you have 
     ) 
     (if (not (null? (cdr aList))) 
       (compare (cdr aList) element)) 'ok) 

이것이 절차라는 문제는 누군가에게 도움이 될 수 있습니다.

인사말

관련 문제