> 1 <
Автор | Сообщение |
d_s__
11 сообщений |
#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
56 сообщений |
#7819 2017-12-13 20:37 GMT+3 часа(ов) |
Цитата Как говорится, зависит от реализации. Спецификация схемы не снисходит до памяти компьютера. Мыслите абстрактнее. ![]() Цитата Это две задачи: 1) по строке получить символ; 2) по символу получить значение. Первая задача решается с помощью функции string->symbol: (string->symbol "x") Вторая задача - с помощью eval: (eval 'x) Цитата Ничего. Значением символа a будет список из символов b и c. Цитата Потому что символ и его значение - это разные вещи. Символ выступает просто как имя. Именами можно манипулировать самими по себе, без связи с означаемым. Например, мы можем оперировать именами «Вася» и «Ъъъ», не думая о конкретных людях по имени «Вася» и об отсутствии людей по имени «Ъъъ». Вообще, символы имеют две ипостаси. Во-первых, из них в основном состоят программы: x, a, b, define, list, eval, string->symbol - примеры символов. В программах они играют разные роли: выступают как имена переменных (в том числе функций) или синтаксических конструкций. Во-вторых, символ - это тип данных. Символы ведут себя как неизменяемые строки, которые можно быстро сравнивать. Строка - это составной тип данных, массив литер. Не всегда они нужны. В ранних лиспах их вообще не было. Изначально лиспы больше применялись не для работы со строками (типа перла), а для символьных вычислений (в математическом смысле - например, функцию продифференцировать и т. п.). И лисповые символы списаны с математических. Например, в математике могут рассмотреть функцию f(x, y). Здесь f, x и у - что? Строки? Буквы? Это просто имена. Имя функции sin вроде как является строкой из трёх букв, но в математике с этой точки зрения не рассматривается. На пересечении двух точек зрения на символы находится идея о том, что раз программа - это, грубо говоря, списки символов, то программами можно манипулировать программно. В современных лиспах для этого используют макросы. |
|
d_s__
11 сообщений |
#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))) Просто оперирование символами, а не строками или указателями как-то сразу в голову "не вошло". |
|
Яков Замир Кацман (нью)
57 сообщений |
#7848 2018-02-21 14:03 GMT+3 часа(ов) |
Получается что Символ это то (т.е ОБЪЕКТ), что/который имеет методы/сеттеры: getf, setf, remf для списка "ключ значение"?
Пишут что: "Since its inception, Lisp has associated with each symbol a kind of tabular data structure called a property list (plist for short)." "Symbols have the following attributes. For historical reasons, these are sometimes referred to as cells, although the actual internal representation of symbols and their attributes is implementation-dependent." Name Package Property list*** Value? Function В этом плане не совсем ясна разница между значепнием value и plist?
отредактировал(а) Яков Замир Кацман (нью): 2018-02-21 16:33 GMT+3 часа(ов) |
|
Соотношение высоты байта к ширине не имеет значения
|
|
misha![]()
1275 сообщений |
#7849 2018-02-21 20:20 GMT+3 часа(ов) |
Символы выступают в роли универсальных меток (указателей) на объекты. Для простоты понимания их лучше рассматривать как глобальные переменные структурного типа. Например,
> (symbol->string 'Apple)symbol->string считывает значение поля "Имя". В ранних лиспах не было структурного типа, хеш-таблиц и т.п., так что символы тогда играли важную роль при построении пользовательских баз данных ![]() |
|
misha![]()
1275 сообщений |
#7850 2018-02-21 20:34 GMT+3 часа(ов) |
Цитатаgetf, setf - лишь удобные макросы, но не более. Существуют более низкоуровневые процедуры, так что лучше воспользоваться макроэкспандом, чтобы во всем разобраться подробнее. |
|
Яков Замир Кацман (нью)
57 сообщений |
#7851 2018-02-23 11:47 GMT+3 часа(ов) |
вот так будет правильнее в целом.
(defpackage :tom |
|
Соотношение высоты байта к ширине не имеет значения
|
> 1 <