Я читаю СИКП. В 2.1.3 сказано:
То есть операции удовлетворяют условию, что для любых объектов x и y, если z равно (cons x y), то (car z) равно x и (cdr z) равно y. ... Вот определения:
(define (cons x y) (define (dispatch m) (cond ((= m 0) x) ((= m 1) y) (else (error "Argument not 0 or 1 -- CONS" m)))) dispatch) (define (car z) (z 0)) (define (cdr z) (z 1))
...
Смысл демонстрации процедурного представления пар не в этом. что наш язык работает именно так (Scheme и системы Lisp в целом, реализовывать пары напрямую из соображений эффективности), но это может работать Сюда. Процедурное представление, хотя и неясное, является совершенно адекватным способом представления пар, поскольку оно удовлетворяет единственным условиям, которым должны соответствовать пары.
В C мы можем реализовать «пару», используя массив, который в ассемблерных кодах реализуется путем выделения одного последовательного адреса памяти для хранения данных. Мы можем проверить размер массива, чтобы убедиться, что это пара.
Тогда почему «процедурное представление» более эффективно для Scheme?
Я изучил компьютерную архитектуру. Приветствуются любые ответы, основанные на языке ассемблера.
Использование структуры вместо массива более распространено в C. Хотя, вероятно, на уровне сборки они будут одинаковыми. (Давайте даже не будем вдаваться в определение размера массива в C...)
@sepp2k Спасибо. Я не являюсь носителем английского языка. Некоторые предложения в SICP кажутся мне двусмысленными, например stackoverflow.com/q/78641848/21294350, хотя я хорошо понимаю, что говорят CSAPP, OSTEP и т. д.
Дело не в эффективности: я не знаю ни одной реализации Scheme, реализующей пары таким образом.
Речь идет о двух вещах:
(Ответ на вопрос в первом пункте – «нет».)
Ваш пункт 2 верен. Как говорит sepp2k, я неправильно понял то, что передает автор.
Как сказано в цитируемом отрывке, Scheme могла бы работать таким образом, но это не так (по соображениям эффективности).