> 1 <

Автор Сообщение

d_s__

Members


Статус

8 сообщений

Где: Russia
Род занятий:
Возраст:

#7818   2017-12-13 17:39 GMT+3 часа(ов)      
Что происходит при (define x 1) ?
Т.е. интересует что происходит в памяти компьютера? Как прикрепляется x к значению 1 ?
Можно ли получить как-то значение символа (т.е. 1) по строке "x"?

Что происходит в более сложном случае (define a (list 'b 'c)) с символами b и с ?
Почему если потом сделать (define b (list 'result 'z)) нельзя получить result за счет (caar a) ?

Что-то видимо не понимаю фундаментальное.

skelter

Members


Статус

40 сообщений

Где: ---
Род занятий:
Возраст:

#7819   2017-12-13 20:37 GMT+3 часа(ов)      
Цитата

Что происходит при (define x 1) ?
Т.е. интересует что происходит в памяти компьютера? Как прикрепляется x к значению 1 ?


Как говорится, зависит от реализации. Спецификация схемы не снисходит до памяти компьютера. Мыслите абстрактнее.

Цитата
d_s__ :
Можно ли получить как-то значение символа (т.е. 1) по строке "x"?



Это две задачи: 1) по строке получить символ; 2) по символу получить значение.

Первая задача решается с помощью функции string->symbol:
(string->symbol "x")

Вторая задача - с помощью eval:
(eval 'x)


Цитата
d_s__ :
Что происходит в более сложном случае (define a (list 'b 'c)) с символами b и с ?



Ничего. Значением символа a будет список из символов b и c.

Цитата
d_s__ :
Почему если потом сделать (define b (list 'result 'z)) нельзя получить result за счет (caar a) ?



Потому что символ и его значение - это разные вещи. Символ выступает просто как имя. Именами можно манипулировать самими по себе, без связи с означаемым. Например, мы можем оперировать именами «Вася» и «Ъъъ», не думая о конкретных людях по имени «Вася» и об отсутствии людей по имени «Ъъъ».

Вообще, символы имеют две ипостаси.

Во-первых, из них в основном состоят программы: x, a, b, define, list, eval, string->symbol - примеры символов. В программах они играют разные роли: выступают как имена переменных (в том числе функций) или синтаксических конструкций.

Во-вторых, символ - это тип данных. Символы ведут себя как неизменяемые строки, которые можно быстро сравнивать.

Строка - это составной тип данных, массив литер. Не всегда они нужны. В ранних лиспах их вообще не было. Изначально лиспы больше применялись не для работы со строками (типа перла), а для символьных вычислений (в математическом смысле - например, функцию продифференцировать и т. п.). И лисповые символы списаны с математических. Например, в математике могут рассмотреть функцию f(x, y). Здесь f, x и у - что? Строки? Буквы? Это просто имена. Имя функции sin вроде как является строкой из трёх букв, но в математике с этой точки зрения не рассматривается.

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

d_s__

Members


Статус

8 сообщений

Где: Russia
Род занятий:
Возраст:

#7820   2017-12-14 12:49 GMT+3 часа(ов)      
Спасибо. Это было то что нужно для понимания.
Теперь понятно почему вместо (caar a) надо писать (car (eval (car a) (interaction-environment))) - это в racket при R5RS
Полный текст:
1-ый вопрос
(define x 1)
(eval (string->symbol "x") (interaction-environment))

2-ый вопрос
(define a (list 'b 'c))
(define b (list 'result 'z))
(car (eval (car a) (interaction-environment)))

Просто оперирование символами, а не строками или указателями как-то сразу в голову "не вошло".
> 1 <


Онлайн :

0 пользователь(ей), 14 гость(ей) :




Реклама на сайте: