> 1 <

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

ferbolg

Members


Статус

16 сообщений

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

#3205   2010-10-18 00:45 GMT+3 часа(ов)      
Доброго времени суток! Подскажите, есть ли в Common Lisp аналог функции SPLIT для работы со списками, которая разбивала бы список на два списки посредине, значением списка становилась бы его первая половина, а функция возвращала бы вторую половину?

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#3206   2010-10-18 00:57 GMT+3 часа(ов)      
(defun split (list)
(let ((cons
(nthcdr (truncate
(1- (/ (length list)
2)))
list)))
(prog1 (cdr cons)
(rplacd cons nil))))

ferbolg

Members


Статус

16 сообщений

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

#3207   2010-10-18 01:58 GMT+3 часа(ов)      
Цитата
ander-skirnir :
(defun split (list)
(let ((cons
(nthcdr (truncate
(1- (/ (length list)
2)))
list)))
(prog1 (cdr cons)
(rplacd cons nil))))




А можно пояснение как отработают строки
 
(prog1 (cdr cons)
 
(rplacd cons nil))
 

?
Насколько я понимаю, (cdr cons) вместе с prog1 обеспесивает нам возвращаемый результат, а каким образом происходит модификация входного списка в (rplacd cons nil)? И еще, зачем было переопределять внутри функции функцию cons, с которой уже связано некое привычное действие? Несколько сбивает с толку, имхо. Но все равно, спасибо за ответ и код.

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#3209   2010-10-18 02:57 GMT+3 часа(ов)      
Разберись, что такое списочные ячейки. Глянь этот рисунок.

> Насколько я понимаю, (cdr cons) вместе с prog1 обеспесивает нам возвращаемый результат
Угу.

> а каким образом происходит модификация входного списка в (rplacd cons nil)?
Список - множество связанных списочных ячеек. Мы модифицируем содержимое cdr одной из них (находящейся ~посередине).
rplaca/rplacd

> И еще, зачем было переопределять внутри функции функцию cons
Ну, во-первых, cons - это еще и название, которое обозначает списочную ячейку, точно так же как list обозначает список (и функцию построения).
Во-вторых, разберись с пространствами имён. Посмотри, что такое Lisp 1, а что такое Lisp 2 и разберись, почему cl - lisp 2, а scheme - lisp 1.

Подсказка:
(defun my-caar (cons)
(let ((car (car cons)))
(car car)))

ferbolg

Members


Статус

16 сообщений

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

#3210   2010-10-18 04:00 GMT+3 часа(ов)      
Спасибо за наводку. Тогда следующий вопрос:
После такой команди
 
(setq b '(a b c . d))
 

каким представление списка b в памяти ? Если можно, покажи рисунок. У меня есть свой вариант, но некуда залить эскиз(

отредактировал(а) ferbolg: 2010-10-18 04:06 GMT+3 часа(ов)

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#3211   2010-10-18 04:27 GMT+3 часа(ов)      
(cons 'a (cons 'b (cons 'c 'd)))

http://www.radikal.ru/

ferbolg

Members


Статус

16 сообщений

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

#3212   2010-10-18 04:57 GMT+3 часа(ов)      
Спасибо, пока у меня вышло такое:



Хотя, наверное я не совсем прав насчет конца списка - связки между b и c . d . Но куда еще привязать указетель на нил, не знаю.

отредактировал(а) ferbolg: 2010-10-18 05:03 GMT+3 часа(ов)

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#3213   2010-10-18 08:58 GMT+3 часа(ов)      
Всё гораздо проще.

> Но куда еще привязать указетель на нил, не знаю.
А в конце такого списка нет указателя на nil.



А твой рисунок - это '(a b (c . d))

misha

Moderators


Статус

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

#3218   2010-10-18 14:34 GMT+3 часа(ов)      
2 ferbolg:
Попробуйте PVTS.

misha

Moderators


Статус

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

#3219   2010-10-18 14:57 GMT+3 часа(ов)      

Не относится к CL.

Есть еще и двойная точечная пара
> '( 1 . 2 . 3 4 5)
'(2 1 3 4 5)
> '(1 2 . 3 . 4 5)
'(3 1 2 4 5)
> (1 2 3 . + . 4)
10

misha

Moderators


Статус

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

#3221   2010-10-18 15:03 GMT+3 часа(ов)      
И еще, советую не забывать, что (a b c) эквивалентно (a b . (c))
Поэтому
>(+ 1 . (2))
3

VH

Members


Статус

289 сообщений

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

#3225   2010-10-18 17:32 GMT+3 часа(ов)      
>ander-skirnir
Скорее

отредактировал(а) VH: 2010-10-18 17:41 GMT+3 часа(ов)

misha

Moderators


Статус

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

#3227   2010-10-18 17:51 GMT+3 часа(ов)      
Цитата
VH :
>ander-skirnir
Скорее


А в чем смысл? Cons ячейку можно представлять по-разному.

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#3232   2010-10-18 18:39 GMT+3 часа(ов)      
VH,
Рисовать так неудобно. А вообще, я это и имел ввиду

> PVTS
Хорошо сделали.

VH

Members


Статус

289 сообщений

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

#3234   2010-10-18 18:51 GMT+3 часа(ов)      
>ander-skirnir
Хювёнен-Сеппянен "Мир Лиспа" т.1 "2.8 Внутреннее представление списков":
«...Списочная ячейка состоит из двух частей, полей CAR и CDR. Каждое из полей содержит указатель (pointer). Указатель может ссылаться (подчеркивание мое - VH.) на другую списочную ячейку или на некоторый другой лисповский объект, как, например, атом... Каждый известный системе атом записан в определенном месте памяти лишь один раз...»

misha

Moderators


Статус

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

#3236   2010-10-18 19:15 GMT+3 часа(ов)      
Это классический вариант, а на деле, все зависит от реализации.

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#3237   2010-10-18 19:34 GMT+3 часа(ов)      
VH,
Я вкурсе, я это и имел ввиду. У меня `внутри ячейки' и `стрелочка' - одно и то же.
А случаев, когда в cons'ах не указатели, а pure data, я не встречал.
Возможно, в sbcl чего-то такого можно добиться хитрыми декларациями типов, safety 0,
и полной изолированностью такого cons'а от внешнего мира, которому это в общем случае не годится.

Fallen_s4e

Members


Статус

114 сообщений
http://lisper.ru
Где: Zimbabwe lisper.ru
Род занятий: fallen_s4e
Возраст: 8

#3238   2010-10-18 20:03 GMT+3 часа(ов)      
Цитата
А случаев, когда в cons'ах не указатели, а pure data, я не встречал.

Конечно встречали. (list 1)
pcl
В целях оптимизации определенные виды объектов, такие как целые числа, меньшие определенного размера, и знаки могут быть представлены непосредственно в памяти

В общем случае этого не добиться ведь cons - это структура из двух int'ов, а int - не резиновый.

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#3239   2010-10-18 20:11 GMT+3 часа(ов)      
Ну я считал, тегирование приравнивается к указателям в таком контексте обсуждения.
Под pure data имелось ввиду, что лежит значение без тега.

misha

Moderators


Статус

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

#3240   2010-10-18 20:20 GMT+3 часа(ов)      
>Это классический вариант, а на деле, все зависит от реализации.
Я имел ввиду, что CONS-ячейки можно организовать даже на языке не имеющем указателей, как тип данных. Например, классический Scheme:
(define (Cons car cdr) (lambda (pair) (pair car cdr)))
(define (Car pair) (pair (lambda (car cdr) car)))
(define (Cdr pair) (pair (lambda (car cdr) cdr)))
 
(define x (Cons 1 (Cons 2 (Cons 3 '()))))
 
> (Car x)
1
> (Car (Cdr x))
2
> (Cdr (Cdr (Cdr x)))
'()

Fallen_s4e

Members


Статус

114 сообщений
http://lisper.ru
Где: Zimbabwe lisper.ru
Род занятий: fallen_s4e
Возраст: 8

#3241   2010-10-18 20:26 GMT+3 часа(ов)      
Ок, буквально понял.

VH

Members


Статус

289 сообщений

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

#3242   2010-10-18 20:27 GMT+3 часа(ов)      
>ander-skirnir
Нарисуем еще картиночку (из Хювёнена-Сеппянена рис.2.8.4):

А Вы как бы это изобразили?

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#3243   2010-10-18 20:43 GMT+3 часа(ов)      
Продублировал бы. Выше уже упомянули, что это очень implementation-dependent. Здесь может быть тег символа и указатель на позицию в таблице символов текущего пакета, а может еще что-нибудь.
Вообще, лучше бы привели пример с разделяемой строкой и её мутацией через разные списки. Вот там я бы не дублировал, а нарисовал со стрелочками.

misha

Moderators


Статус

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

#3244   2010-10-18 20:49 GMT+3 часа(ов)      
>А Вы как бы это изобразили?

misha

Moderators


Статус

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

#3245   2010-10-18 21:30 GMT+3 часа(ов)      
(define x '(B C))
(define y (list (list (car x) (cadr x)) 'A (car x) (cadr x)))
> 1 <


Онлайн :

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