car и cdr в схеме не дадут ожидаемого результата - PullRequest
0 голосов
/ 12 марта 2019

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

(define test
  (lambda (lst)
    '((car lst).cdr (lst))))

А при работе

(test '(a.b.c))

Я получаю вывод:

'((car lst) .cdr (lst))

Как мне заставить его использовать функции car и cdr, а не обрабатывать их как строки?

Ответы [ 2 ]

2 голосов
/ 12 марта 2019

Когда вы цитируете что-то, например, '(1 2 3 4), результатом будет структура данных, созданная во время чтения без какой-либо оценки.

'((car lst) .cdr (lst))))
; ==> ((car lst) .cdr (lst)))

Он делает именно то, что вы говорите. Это все равно что жаловаться, что оценка строки "5 + 5" не дает вам 10.

Если вы на самом деле хотите автомобиль чего-то, то вы делаете это:

(define (test lst)
  (car lst))

(test '(1 2 3)) ; ==> 1

Вы можете сделать мелкую копию пары следующим образом:

(define (shallow-copy pair)
  (cons (car pair) (cdr pair)))

(define test-value (list 1 2 3))
(define shallow-value (shallow-copy test-value)))

(eq? test-value shallow-value)            ; ==> #f
(eq? (cdr test-value) (cdr shallow-value)); ==> #t

Я понятия не имею, что ваша процедура должна делать, поэтому не может помочь вам в дальнейшем.

2 голосов
/ 12 марта 2019

Символ ' или quote - это процедура, которая создает константу.Вот почему вы получили '((car lst) .cdr (lst)) в качестве вывода. Вы в основном вычислили строковое выражение ((car lst) .cdr (lst)).Прочитайте здесь об этом.Правильная форма того, что вы хотели сделать, должна быть написана так:

(define test
    (lambda (lst)
        (list (car lst) (cdr lst))))

(test '(a b c))

Вывод будет списком, в котором первый элемент будет car из '(a b c), то есть aи вторым элементом будет cdr из '(a b c), который является списком (b c).Выход будет: (a (b c))

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