СХЕМА: Объекты в списке - PullRequest
       0

СХЕМА: Объекты в списке

3 голосов
/ 28 декабря 2011

У меня есть список объектов в схеме, как описано ниже.Как можно вызывать функции объектов, когда, например, вынимаем первый элемент из списка?

(define persons false)
(define length 10)

(let loop ((n 0))
    (if (< n length)
        (begin
            (define newp (make-person))
            (send newp setage (- 50 n))

            (cond
                 ((= n 0)
                        (set! persons (list newp)))
                 (else
                        (set! persons (cons persons newp)))
            )

            (loop (+ n 1))
        )
     )
 )

 (define (firstpersonage)
     (send (car persons) getage)
 )

При вызове первого лица я получаю сообщение об ошибке, что такого метода нет.Есть ли способ «бросить» первый объект типа «человек»?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 27 января 2012

Во-первых, пожалуйста делайте научитесь отступать Лисп правильно.

Во-вторых, ваша проблема в том, что вы решили использовать кучу побочных эффектов для созданиясписок людей в Схеме (и, как следствие, вы споткнулись о один из лучших моментов построения списка).

В этой ситуации я бы написал:

(define persons
  (map (lambda (n)
         (let ((newp (make-person)))
           (send newp setage (- 50 n))
           newp))
       (iota 10)))

(define (firstpersonage)
  (send (car persons) getage))

is, определите person как список из десяти человек в возрасте от 50 до 41 года. Делая это таким образом, вы исключаете множество ошибок, включая ту, которую вы только что укусили.

Если вы абсолютно точно не можете расстаться со своими set! s, похоже, ошибка в строке

(set! persons (cons persons newp))

cons не добавляет два списка, он добавляет новый элемент в начало списка.Например,

(cons 3 (list 2 1)) => (3 2 1)

Если вы сделаете это наоборот, вы не получите то, что ищете

(cons (list 1 2) 3) => ((1 2) . 3)
1 голос
/ 27 января 2012

Вы получаете ошибку, потому что вы используете cons неправильный путь;вы не строите правильный список.(cons persons newp) создает новую пару и помещает людей в car и newp в cdr, поэтому, когда вы закончите, то, что в car из persons, не является одним из этих объектов-людей,Возможно, вы обнаружите, что (cdr persons) является личным объектом, и что вы можете сделать (send (cdr persons) getage) просто отлично.И (cdar persons) и (cdaar persons) тоже являются объектами-людьми.Так что вид является списком, только элементы находятся в cdr s, а хвосты - в car s (пока вы не попадете в первоначальный список, который вы создали с помощью (list newp), гдеопять наоборот).

Во всяком случае, если вы переключите его так, чтобы он шел (cons newp persons), он должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...