> 1 <

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

d_s__

Members


Статус

10 сообщений

Где: 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


Статус

54 сообщений

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

#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


Статус

10 сообщений

Где: 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)))

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

Яков Замир Кацман (нью)

Members


Статус

47 сообщений

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

#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?

 
 
(setf values
'(
:one "1"
:two "2"
:free "3"
)
)
(getf values :free)
(getf values keyword::two)
 
 
(setf values2
'(
"one" "1"
"two" "2"
"free" "3"
)
)
(getf values2 "free")
 
 
P/S что касается setf то вроде бы, что:
(set symbol value) == (setf (symbol-value symbol) value)
(get x y) == (getf (symbol-plist x) y)
 
 
 
 
;;[1] http://clhs.lisp.se/Body/m_setf_.htm#setf
;;[2] http://www.lispworks.com/documentation/lw70/CLHS/Body/t_symbol.htm
;;[3] https://stackoverflow.com/questions/3855094/what-is-the-difference-between-an-atom-and-a-symbol-in-common-lisp
;;[4] https://stackoverflow.com/questions/27200120/how-to-get-a-property-from-a-plist
;;[5] https://stackoverflow.com/questions/33382993/how-does-lisps-getf-work-for-a-list
;;[6] https://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node108.html
;;[7] или уж совсем просто. http://jtra.cz/stuff/lisp/sclr/getf.html
;;[8] https://groups.google.com/forum/#!msg/comp.lang.lisp/1OERjYfSKqc/keoNb0gdKjoJ symbol-value
;;[9] http://clhs.lisp.se/Body/f_symb_5.htm symbol-value
;;[10] http://clhs.lisp.se/Body/m_remf.htm
;;[11] https://www.svbug.com/documentation/lisp/node52.html (Property Lists)
;;[12]https://www.hexstreamsoft.com/articles/ тоже интересно.
 
 
 

отредактировал(а) Яков Замир Кацман (нью): 2018-02-21 16:33 GMT+3 часа(ов)

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#7849   2018-02-21 20:20 GMT+3 часа(ов)      
Символы выступают в роли универсальных меток (указателей) на объекты. Для простоты понимания их лучше рассматривать как глобальные переменные структурного типа. Например,
> (symbol->string 'Apple)
"Apple"
symbol->string считывает значение поля "Имя". В ранних лиспах не было структурного типа, хеш-таблиц и т.п., так что символы тогда играли важную роль при построении пользовательских баз данных

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#7850   2018-02-21 20:34 GMT+3 часа(ов)      
Цитата
Яков Замир Кацман (нью) :
Получается что Символ это то (т.е ОБЪЕКТ), что/который имеет методы/сеттеры: getf, setf, remf для списка "ключ значение"?
В этом плане не совсем ясна разница между значепнием value и plist?
getf, setf - лишь удобные макросы, но не более. Существуют более низкоуровневые процедуры, так что лучше воспользоваться макроэкспандом, чтобы во всем разобраться подробнее.

Яков Замир Кацман (нью)

Members


Статус

47 сообщений

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

#7851   2018-02-23 11:47 GMT+3 часа(ов)      
вот так будет правильнее в целом.

(defpackage :tom
(:use :common-lisp)
(:export #:main)
)
 
(in-package :tom)
(defvar *p*)
(defun main()
(format t "getuu_free ~d" (getf tom::*p* :free))
)
 
(in-package :tom)
(let ((tom::*p*))
(setf tom::*p*
'(
:one "1"
:two "2"
:free "3"
)
)
(tom::main)
)
> 1 <


Онлайн :

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




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