2016-10-17 5 views
0

Я пытаюсь понять, что процедуры и данные практически одинаковы в lisp. SICP говорит, что:процедуры против встроенных данных

  • значения цифр являются цифры, которые они называют,
  • представлены значения встроенных операторов являются последовательности команд машины, которые выполняют соответствующие операции, и
  • представлены значения другими именами являются объекты, связанные с этими именами в среде.

Второе условие гласит, что «значения встроенных операторов - это последовательности машинных команд, которые выполняют соответствующие операции». если я хочу изменить значения, изменив таким образом машинные инструкции, например:

(define + 2) 

    (* + 3) ;6 

все работает нормально.

Теперь первый случай предусматривает, что «значения цифр - это номера, которые они называют». Если я напечатаю

2 

Значение представляет собой представление 2, которое выводится. Теперь, если я хочу его изменить, вот так:

(define 2 +) ;bad syntax 

Почему это?

ответ

2

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

В листе в вашем примере 2 и 3.1415 являются литералами - + может быть символом. Таким образом, имеет смысл переадресовать символ или имя в другом месте. Литералы, однако, всегда будут данными. Они отличаются от имен.

Вы можете определить язык, на котором есть литералы, точно так же, как +, символы, сопоставленные со значением по умолчанию, которые могут быть повторно отображены, если хотите. Примером такого языка может быть предварительный процессор C.

EDIT: В более общем плане, вы прокомментировали, что «код - это данные» в lisp. Ваш пример - плохой пример этой функции - это вопрос, который касается парсера или грамматики языка и его токенов.

Лучшим примером может служить следующее:

(+ 2 3) 

Это выражение является как исполняемый оператор, и структура данных. А именно он может кодировать «в вызов функции, которая возвращает 5» или, если префикс «не оценивать меня сразу '» структуры пары

(+ . (2 . (3 . NIL))) 

, который является стандартом связанного списка структуры находится в LISP реализации. Вы можете передать эту структуру данных в коде, выполнить ее позже с чем-то вроде функции EVAL или (наиболее сильно), отредактируйте ее, чтобы она выполняла что-то еще, а затем выполняла ее.

Это возможно, потому что lisps: homoiconic - исходный код работает как код, так и данные.

+0

Ах да, вы абсолютно правы! У меня процедура и код запутались. – morbidCode

2

процедуры и данные практически совпадают в LISP

Это не так. Процедуры - это данные. Один вид данных. Существуют и другие виды данных: числа, строки, ячейки cons, символы, векторы, ...

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

Но невозможно изменить 2, так как это число, а не переменная. Число не имеет привязки. Значение 2 уже 2.

+0

Тогда вы можете объяснить далее, что означает выражение «значения цифр - это номера, которые они называют»? Я очень смутился этим, потому что я думал, что «цифры, которые они называют», говорят о представлении чисел на более низких уровнях. – morbidCode

+1

@morbidCode, тот же * номер * может быть написан по-разному с помощью разных цифр *. Например, число, представленное 2 в десятичной нотации, может быть представлено также цифрой 10 в двоичной нотации. Оба представляют одинаковое число, которое является абстрактным объектом. Когда мы говорим неформально или когда нет двусмысленности, мы можем сказать, что 2 - это число, но на языках программирования вы можете использовать разные системы с числами, например, на многих языках, как цифры # x03BB, так и 955 обозначают одинаковое число. – Renzo

+0

@ Ренцо получил это. Но что это значит, когда мы говорим «ценность» в этом контексте? В частности, «значения цифр» и «значение 2 уже равно 2.» 2 само по себе является ценным правилом? Как я могу различать имя и значение? – morbidCode