Выбрать элементы из списка в схеме - PullRequest
1 голос
/ 12 июня 2009

Как пройти список или получить элемент из списка в схеме?

Как я могу назвать каждый элемент (как мы делаем для переменных в Java) в списке?

Заранее спасибо.

Я хочу сравнить каждую точку в списке с другой точкой. Итак, как мы делаем в Java или Python -

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

}

Как мне сделать подобное в схеме?

Ответы [ 7 ]

5 голосов
/ 12 июня 2009
(map (lambda (x) (if (< x k) (dosomething x) x)) list)
4 голосов
/ 12 июня 2009

Леппи и Джонас дают правильный ответ для перебора списка в Схеме. Однако, если вам нужно получить одно значение в списке, используйте list-ref.

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

=> 3

В основном эквивалентен коду Java

int[] l = new int[] { 1, 2, 3, 4 };
return l[2];
2 голосов
/ 12 декабря 2009

Вы должны думать иначе, когда пишете на функциональном языке. На самом деле вы должны забыть о программировании (для циклов и т. Д.), Просто определить, что вы хотите. Например, «Я хочу применить действие к каждому нечетному номеру в моем списке». Так что вы бы написали:

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

Или условие может быть элементом> 4

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

Для действия вы предоставляете любую функцию:

> (map number->string
       (filter higher-than-four? my-list))
("5" "6" "7" "8" "9" "10")
2 голосов
/ 12 июня 2009

Вы можете использовать для каждого :

    (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-each аналогично map, но возвращаемое значение не указано. Это вызвано только для его побочных эффектов.

Кстати, мне кажется, что вы изучаете схему, исходящую из Java-фона (что нормально). Схемы программ часто пишутся в другом стиле, нежели в Java. Схема - это функциональный язык, и циклические конструкции используются не так часто. Поднимите книгу о Схеме, например Язык программирования схем или Как разрабатывать программы , чтобы научиться писать программы "Способом схемы"

0 голосов
/ 21 апреля 2010

Я не уверен, что это то, что вам нужно, но это относится ко всему списку (связанному) и сравнивает каждый элемент с элементом, который вы передаете в качестве параметра:

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

Проблема в том, что это процедура, может быть, она кому-нибудь пригодится.

приветствует

0 голосов
/ 26 июня 2009

Вы можете использовать list-ref, чтобы извлечь значение из списка по его индексу. Но обратите внимание, что списки Scheme на самом деле являются связанными списками - поэтому (list-ref l 100) будет необходимо проследить через 100 ссылок Если вы действительно хотите значения с произвольным доступом, используйте вектор.

0 голосов
/ 12 июня 2009

Пример

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

В этом случае «dosomething» будет каким-то другим определением, либо предопределенным, либо нет. Определение, аналогичное «функции», скажем, например, square () или mult (), в качестве примеров.

Я думаю, что рекурсивный, подобный этому, должен работать для нужд списка:

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

Вы также можете написать два определения, одно из которых содержит список, отправить его в первый пример и вернуть результат, сравнить, что-то сделать или нет и продолжить.

...