Форум программистов, компьютерный форум, киберфорум
Языки JVM
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/29: Рейтинг темы: голосов - 29, средняя оценка - 5.00
356 / 124 / 3
Регистрация: 25.01.2012
Сообщений: 5,464
Записей в блоге: 118
1

Clojure Базовые идеи языка Lisp

17.09.2012, 14:31. Показов 5838. Ответов 65
Метки lisp (Все метки)

Author24 — интернет-сервис помощи студентам
википедия
Одной из базовых идей языка Lisp является представление каждого символа как узла многокоординатной символьной сети; при этом координаты, свойства, уровни сети записаны в так называемых слотах символа. Основные слоты:
имя символа (основополагающее Аристотелево А=А из которого вырастает лямбда-исчисление),
функциональный слот,
слот-значение
расширяемый список свойств (можно свободно расширить слотовую систему удобным для решения задачи способом).
уважаемы знатоки, я выбирал язык для освоения по другим признакам (я искал возможности рекурсии с минимальными ограничениями), все они в той или иной степени присутствуют в Lisp, но не могли бы вы прокомментировать этот отрывок статьи? хотя, сеть-это и есть рекурсия, если можно так сказать. но всё таки хотелось бы поподробнее, знание базовых идей облегчит освоение и ускорит оттачивание мастерства. литература больше посвящена самому языку, а не его базовым идеям, поэтому вопрос и тема, вобщем, уместны.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.09.2012, 14:31
Ответы с готовыми решениями:

Работа со списками в LISP, используя базовые функции CAR, CDR, CONS
Дан список ( (A B ( C ) ) (D (E) (K L M))) получить: список (C) список (A B C D) ...

Что из себя представляют базовые средства языка?
в билете к экзамену есть такой вопрос....про что здесь нужно отвечать??:help:?

ПЕРЕМЕННЫЕ И БАЗОВЫЕ ТИПЫ ДАННЫХ ЯЗЫКА ПРОГРАММИРОВАНИЯ С
Задание 1 1. Выполните ввод данных (включая числовые) с помощью функции scanf_s(). В частности,...

Что должен знать претендент на вакансию где требуют базовые знания языка C#?
Что в себя в включает базовое знание языка C#?что должен знать претендент на вакансию где требуют...

65
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,645
Записей в блоге: 13
17.09.2012, 14:57 2
Не рискну причислить себя к знатокам, но попробую ответить.

Символ - это сущность, которая должна иметь свойства. Каждому символу Лиспа соответствует область памяти - т.н. информационная ячейка. Эта ячейка имеет поля, в которых хранятся ссылки на:

имя символа;
определяющее выражение (если символ есть имя функции);
значение символа;
указатель на список свойств

При этом:

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

Вот небольшой пример:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
;; Определяем функцию f
(defun f (x y) (+ (* x x) (* y y)))
 
==> f
 
;; присваиваем символу f значение 111
 
(setf f 111)
 
==> 111
Ñîçäàíà ãëîáàëüíàÿ ïåðåìåííàÿ f
 
;; чему равно значение f ?
 
f
 
==> 111
 
;; вывов функции
 
(f 3 4)
 
==> 25
 
;; Запрос списка свойств символа f
 
(proplist 'f)
 
==> (EXPR)  ;; список свойств включает символ EXPR - это значит, что f - это обычная функция Лиспа
0
356 / 124 / 3
Регистрация: 25.01.2012
Сообщений: 5,464
Записей в блоге: 118
17.09.2012, 15:52  [ТС] 3
спасибо, хоть это и имеется частично в литературе, а вот этот ньюанс как-то заувалирован там, в литературе:
указатель на список свойств
можно поподробнее?

Добавлено через 33 минуты
вообще что может включать в себя расширяемый список свойств? что можно добавить? список свойств вроде уже открыт в помощи по HomeLisp. а вот что можно добавлять? можно-ли делать расширение или редактирование списка свойств атома при исполнении программы?
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,645
Записей в блоге: 13
17.09.2012, 17:32 4
Про списки свойств могу рассказать применительно к HomeLisp. У символа может быть в наличии список свойств. Этот список создает и использует программист. Структура списка может быть, в принципе, произвольной. В документации спискам свойств посвящен соотв. раздел.

Если кратко, то в списке свойст могут быть стандартные индикаторы FIXED, FLOAT, STRING и т.д.,
а также индикаторы, создаваемые пользователем. Вот пример из финского двухтомника:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
(putprop 'ягода 'цвет 'красный) ;; символу ЯГОДА создаем индикатор ЦВЕТ со значением КРАСНЫЙ
 
==> ягода
 
(putprop 'ягода 'вкус 'кислый) ;; символу ЯГОДА создаем индикатор ВКУС со значением КИСЛЫЙ
 
==> ягода
 
(getprop 'ягода 'вкус) ;; проверка вкуса
 
==> кислый
 
(getprop 'ягода 'цвет) ;; проверка цвета
 
==> красный
 
(getprop 'ягода 'размер) ;; проверка размера (нет такого свойства)
 
==> NIL
 
(proplist 'ягода) ;; можно посмотреть весь список свойств
 
==> (цвет красный вкус кислый)
В списках свойств можно хранить любую разумную информацию (в т.ч. и опрределяющие выражения функций).

В HomeLisp-e целый ряд объектов использует списки свойств. Например, графические окна имеют списки свойств, содержащие размеры, цвет фона и заголовок:

Lisp
1
2
3
4
5
6
7
(grwCreate 'w 200 200 "Окошечко" _WHITE) ;; создаем окно
 
==> w
 
(proplist 'w) ;; смотрим его список свойств
 
==> (WINDOW width 200 height 200 title "Окошечко" backcolor &HFFFFFF WINHANDLE 1)
Если изменить что-либо в списке свойств, изменится и характеристика видимого объекта.

Примерно так...
1
356 / 124 / 3
Регистрация: 25.01.2012
Сообщений: 5,464
Записей в блоге: 118
17.09.2012, 18:41  [ТС] 5
спс. а как насчёт определения объекта по свойствам? извиняюсь, конечно, что недочитал до нужного места ни помощь, ни книгу. в помощи вроде нет таких операций с свойствами. или это было бы похоже больше на пролог? в прологе вроде есть такое, но он мне не интересен по сути
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,645
Записей в блоге: 13
17.09.2012, 18:44 6
Цитата Сообщение от Hretgir Посмотреть сообщение
определения объекта по свойствам?
- что это значит? Не вполне понимаю.
0
356 / 124 / 3
Регистрация: 25.01.2012
Сообщений: 5,464
Записей в блоге: 118
17.09.2012, 19:03  [ТС] 7
например объекту ягода заданы индикаторы: вещество мякоть , цвет красный, вкус кислый, другой объект, сок, имеет индикаторы: вещество отжатый, цвет красный, вкус кислый. можно ли введя ряд индикаторов определить какому объекту они принадлежат?
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,645
Записей в блоге: 13
17.09.2012, 19:18 8
Думаю, что в общем случае - нельзя. Ведь один и тот же цвет может быть у разных ягод (клубника, малина и клюква красные). Другое дело, что если есть список символов с какими-либо свойствами, то совсем нетрудно написать функцию, которая отфильтрует нужные. Вот функция, которая берет на вход произвольный список и атом-индикатор. Функция возвращает список только тех элементов, у которых в списке свойств присутствует заданный индикатор:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
(defun pfiltr (x flg) 
    (cond ((null x) nil)
             ((member flg (proplist (car x))) (cons (car x) (pfiltr (cdr x) flg)))
             (t (pfiltr (cdr x) flg))))
 
==> pfiltr
 
(pfiltr '(1 2 3 1.2 1.3 "ggg" "rrr") FIXED)
 
==> (1 2 3)
 
(pfiltr '(1 2 3 1.2 1.3 "ggg" "rrr") FLOAT)
 
==> (1.200000000000000E+0 1.300000000000000E+0)
 
(pfiltr '(1 2 3 1.2 1.3 "ggg" "rrr") STRING)
 
==> ("ggg" "rrr")
1
356 / 124 / 3
Регистрация: 25.01.2012
Сообщений: 5,464
Записей в блоге: 118
17.09.2012, 23:30  [ТС] 9
иными словами, функций базы сетевых данных в языке не заложено. ясно. спс.

Добавлено через 7 минут
Цитата Сообщение от Hretgir Посмотреть сообщение
координаты, свойства, уровни
это с отрывка в википедии. можете что нибудь пояснить, что автор статьи мог излагать , имея их ввиду? просто тут интересный момент, раз он написал "представление каждого символа как узла многокоординатной символьной сети", то я боюсь что-то пропустить и возможно миновать более короткие пути написания кода

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

Добавлено через 13 минут
Цитата Сообщение от Catstail Посмотреть сообщение
Функция возвращает список только тех элементов, у которых в списке свойств присутствует заданный индикатор:
ну тоже что-то
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,645
Записей в блоге: 13
18.09.2012, 10:05 10
Цитата Сообщение от Hretgir Посмотреть сообщение
уровни сети записаны в так называемых слотах символа
- это относится к деталям реализации Common Lisp. Ничего определенного сказать не могу.
0
356 / 124 / 3
Регистрация: 25.01.2012
Сообщений: 5,464
Записей в блоге: 118
19.09.2012, 08:46  [ТС] 11
вот не понятно, для каких вообще целей могут использоваться точечные пары? какая разница, что это будет точечная пара, или список из двух атомов?
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,645
Записей в блоге: 13
19.09.2012, 10:30 12
Для тех же, что и списки... Точечная нотация описывает более широкий класс данных, нежели список. Но списки используются чаще, т.к. списочная запись короче (лаконичнее). Сравните:

Lisp
1
2
3
4
5
6
7
8
9
;; вот список:
 
'(((dv) (((dt))) g (cc (x (y (((z))))))))
 
==> (((dv) (((dt))) g (cc (x (y (((z))))))))
 
;; а вот его точечная запись:
 
(((dv . NIL) . ((((dt . NIL) . NIL) . NIL) . (g . ((cc . ((x . ((y . ((((z . NIL) . NIL) . NIL) . NIL)) . NIL)) . NIL)) . NIL)))) . NIL)
И что, по-вашему, удобнее?

Точечная пара отличается от двухатомного списка лишним Nil:

Lisp
1
2
3
4
5
6
7
'(a . b)
 
==> (a . b)  ;; точ. пара
 
(dotprint '(a b))
 
==> (a . (b . NIL))  ;; список
Точечная пара занимает меньше места...
0
356 / 124 / 3
Регистрация: 25.01.2012
Сообщений: 5,464
Записей в блоге: 118
19.09.2012, 13:15  [ТС] 13
какого места? по длине вроде то же самое, даже если визуально точечная пара не длинее кажется.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,645
Записей в блоге: 13
19.09.2012, 13:33 14
Цитата Сообщение от Hretgir Посмотреть сообщение
какого места?
- в оперативной памяти. Вот здесь расположен раздел документации, описывающий внутреннее строение структур Лиспа. Кратко: в памяти выделяются две области: область информационных ячеек атомов и область списочной памяти. Списочная память разбита на 64-битные ячейки. Каждая хранит два указателя A-указатель и D-указатель. В свою очередь, эти указатели могут указывать на другие списочные ячейки или на инф. ячейки атомов. На миниатюре приведена иллюстрация.
Миниатюры
Clojure Базовые идеи языка Lisp  
0
356 / 124 / 3
Регистрация: 25.01.2012
Сообщений: 5,464
Записей в блоге: 118
19.09.2012, 13:47  [ТС] 15
я смотрел это место, но представление структуры ((А В)С Т)), как точечной в графическом представлении отсутствует и разница всё равно не понятна
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,645
Записей в блоге: 13
19.09.2012, 14:04 16
Точечная или списковая - это исключительно для восприятия человеком. В памяти все хранится так, как на картинках показано.
1
356 / 124 / 3
Регистрация: 25.01.2012
Сообщений: 5,464
Записей в блоге: 118
01.10.2012, 00:13  [ТС] 17
а в Lisp вообще понятие оператора существует?
0
2 / 2 / 0
Регистрация: 25.07.2012
Сообщений: 34
01.10.2012, 01:13 18
вы когда смотрите на яблоко, вы уверены что вы смотрите на яблоко? по каким признакам вы опередили что это яблоко?
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,645
Записей в блоге: 13
01.10.2012, 15:16 19
Цитата Сообщение от Hretgir Посмотреть сообщение
а в Lisp вообще понятие оператора существует?
Тело функции может состоять из одного или более S-выражений, которые вычисляются последовательно. Можно назвать эти S-выражения операторами.
1
356 / 124 / 3
Регистрация: 25.01.2012
Сообщений: 5,464
Записей в блоге: 118
06.10.2012, 19:16  [ТС] 20
вопрос. вот в обычных языках программирования, допустим, объявляем переменную е(к), то есть впринципе мы создаём одномерный массив, без явного объявления такового. то есть е(к), при к=5, равно 10, и т.д. двумерный массив е(к)(т). а как это реализовывается в лиспе, когда нам в конечном счёте не известно максимальное значение к и т, и собственно знать нам его не надо-нам важен результат: е(к)(т)? и в чём конечная цель лисповского вида реализации, однозначно-же:вид реализации должен быть подходящим для каких-то сопутствующих процессов поставленных юзером?

Добавлено через 25 минут
просто на самом деле, тяжеловато всё читается, когда знаком с элементарными языками, вроде читаешь листинг-всё понятно, а вещи которые не описаны в листингах, но являются в большинстве программ необходимыми отсутствуют, и представить себе их реализацию, без полного знания языка, трудновато.
0
06.10.2012, 19:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.10.2012, 19:16
Помогаю со студенческими работами здесь

О жизнеспособности языка Lisp
Прочти сообщение выше. Не знаю насколько это афера, как по мне в лиспе за полвека так ничего...

Лямбда выражениями и функциями языка Lisp
Всем привет! Помогите пожалуйста разработать функцию, объединяющую два списка в результирующий...

Определить с использованием языка LISP генератор случайных чисел
Определить с использованием языка LISP генератор случайных чисел. Эта функция должна поддерживать...

Написать макрос-тест, проверяющий пользователя на знание математических функций языка lisp
Написать макрос-тест, проверяющий пользователя на знание математических функций языка lisp.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru