Почему Scheme использует процедурное представление пар?

Я читаю СИКП. В 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?

Я изучил компьютерную архитектуру. Приветствуются любые ответы, основанные на языке ассемблера.

Как сказано в цитируемом отрывке, Scheme могла бы работать таким образом, но это не так (по соображениям эффективности).

sepp2k 07.07.2024 13:00

Использование структуры вместо массива более распространено в C. Хотя, вероятно, на уровне сборки они будут одинаковыми. (Давайте даже не будем вдаваться в определение размера массива в C...)

Shawn 07.07.2024 14:53

@sepp2k Спасибо. Я не являюсь носителем английского языка. Некоторые предложения в SICP кажутся мне двусмысленными, например stackoverflow.com/q/78641848/21294350, хотя я хорошо понимаю, что говорят CSAPP, OSTEP и т. д.

An5Drama 08.07.2024 03:21
За пределами сигналов Angular: Сигналы и пользовательские стратегии рендеринга
За пределами сигналов Angular: Сигналы и пользовательские стратегии рендеринга
TL;DR: Angular Signals может облегчить отслеживание всех выражений в представлении (Component или EmbeddedView) и планирование пользовательских...
Sniper-CSS, избегайте неиспользуемых стилей
Sniper-CSS, избегайте неиспользуемых стилей
Это краткое руководство, в котором я хочу поделиться тем, как я перешел от 212 кБ CSS к 32,1 кБ (сокращение кода на 84,91%), по-прежнему используя...
0
3
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Дело не в эффективности: я не знаю ни одной реализации Scheme, реализующей пары таким образом.

Речь идет о двух вещах:

  1. Выразительная сила. Если у вас есть первоклассные процедуры, оказывается, что их можно использовать для реализации самых разных вещей. Если хотите, вы можете реализовать пары, используя их. Вы можете задаться вопросом: есть ли что-нибудь, что вы не сможете реализовать с их помощью, если захотите?
  2. Абстракция. Название этого раздела SICP — «Введение в абстракцию данных», и оно подчеркивает, что важен интерфейс к чему-то, а не то, как он реализован. Пока интерфейс остается прежним, реализация может не иметь большого значения.

(Ответ на вопрос в первом пункте – «нет».)

Ваш пункт 2 верен. Как говорит sepp2k, я неправильно понял то, что передает автор.

An5Drama 08.07.2024 03:25

Другие вопросы по теме

Похожие вопросы

Являются ли побитовые операторы медленнее, чем обычные циклы, такие как цикл for?
Как извне установить соответствие ядра ЦП для процесса в системах Windows с более чем 64 ядрами?
Самый эффективный способ SELECT в кластерной таблице?
Как ускорить интерполяцию для этого конкретного примера?
Каков самый быстрый способ расчета ежедневного баланса со сложными процентами в Pandas или Spark?
Почему INumber<T>.CreateX(int n) настолько медленный по сравнению с неявным преобразованием для чисел с плавающей запятой и двойной точности?
Есть ли название для этого типа структурированных данных и как его более эффективно использовать?
Преобразование списка ИЛИ массива в диапазон
Почему массив % 1 работает на 150 % медленнее для меньших чисел, чем для больших?
Левая часть выражения LIKE должна иметь значение varchar (фактически: varbinary). Какая альтернатива преобразованию varbinary в varchar?