Re[5]: [LINQ] cons, car, cdr
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 16.10.08 17:36
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Небольшая поправочка. Cdr в Лиспе возвращает хвост списка.


Не хвост, а именно что второй элемент.

С хвостом проще, есть готовый метод Last.

VD> Просто в приведенном примере в хвосте остается только один элемент. Так что реализовывать его надо просто как Skip(1).


Просто Skip(1) возвращает IEnumerable<T>, а не Т

VD>Проблема еще в том, что в Лиспе при выводе на консоль списка выводятся его значении, а в дотнете дурацкое имя класса итератора.


Это не проблема, если речь идет не о написании книжки.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[5]: [LINQ] cons, car, cdr
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.10.08 19:23
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>cons создает элементы списка. nil — это пустой списко, а cons — конструктор элемента списка. Его задача добавить новый элемент в конец существующего списка. Кортежей в Лиспе вообще нет, так как Лисп язык динамически типизированный.


Сори, конечно же в начало списка, так как однонаправленные связанные списки вставляют элементы в начало списка.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: [LINQ] cons, car, cdr
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.10.08 19:58
Оценка:
Здравствуйте, gandjustas, Вы писали:

VD>>cons создает элементы списка. nil — это пустой списко, а cons — конструктор элемента списка. Его задача добавить новый элемент в конец существующего списка.


G>(cons x y), где x и y не nil, что создает? Список? А где его конец? Можно ли для него применить fold?

G>Тем не менее это вполне корректное выражение и создает корректный результат.

Да, согласен. Тут я гоню. Список это конечно же частный случай. Но и кортежем это ни как не является. Если только частным случаем — парой.
Создать кортеж из 3 элементов уже не удастся. Точнее чтобы объединить более одного элемента используются ссылки, так что по любому выходит список или дерево.

VD>>Кортежей в Лиспе вообще нет, так как Лисп язык динамически типизированный.

G>Разве это мешает кортежам?

Мх. Наверно это зависит от определения. Я видимо привык к определению кортежей из статически типизированных языков.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: [LINQ] cons, car, cdr
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.10.08 20:06
Оценка:
Здравствуйте, AndrewVK, Вы писали:

VD>>Небольшая поправочка. Cdr в Лиспе возвращает хвост списка.


AVK>Не хвост, а именно что второй элемент.


Не. Для списков возвращается именно что хвост. Просто в примере как раз не список. Тут я ошибся. В примере пара числел и пара пар чисел. Так что cdr действительно вынимает целое. Но это не элемент, а значение.

AVK>С хвостом проще, есть готовый метод Last.


На самом деле данный пример просто не выражается последовательностями. Я, честно говоря, сильно подзабыл Лисп. Не знаю только огорчает меня это или радует .
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: [LINQ] cons, car, cdr
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.10.08 20:16
Оценка:
Здравствуйте, VladD2, Вы писали:

G>>cons создает кортеж.


VD>cons создает элементы списка. nil — это пустой списко, а cons — конструктор элемента списка. Его задача добавить новый элемент в конец существующего списка. Кортежей в Лиспе вообще нет, так как Лисп язык динамически типизированный.


Подумал по шипче и понял, что гоню. cons двух атомов создает нечто вроде пары, что действительно можно выразить чем-то вроде класса с двумя полями. Но назвать частный случай "пару" общим словом "кортеж", у меня все равно рука не поворачивается.

Однако применительно к примеру из темы, код отсюда:
http://rsdn.ru/forum/message/3140798.1.aspx
Автор: Spiceman
Дата: 16.10.08

и отсюда:
http://rsdn.ru/forum/message/3140988.1.aspx
Автор:
Дата: 16.10.08

действительно точнее отражает суть.
Так что если имеется в виду не котреж как тип данных, а его частный случай — пара, то соглашусь.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: [LINQ] cons, car, cdr
От: Аноним  
Дата: 16.10.08 23:21
Оценка: +1
Здравствуйте, AndrewVK, Вы писали:

AVK>Ты это всерьез?


Для тех кто подзабыл Лисп напоминаю, что cons/car/cdr в нем используются для создания/работы со структурами не только типа "однотипный список", но и с любыми другими (в частности с иерархическими или, скажем, списками неоднородных элементов). Автор топика хотел увидеть имплементация именно базовых cons/car/cdr, а не случай их частного применения к однородному списку.

Hint: Попробуй проверить свое решение на вот таком расширенным примере:
(define x (cons 1 2))
(define y (cons 3 4))
(define z (cons x y))
(define p (cons x z))
(car (car z))
1
(car (cdr z))
3
(car (cdr (cdr p)))
3


...при помощи базового cons можно создавать и такие структуры:


PS Ленивые cons/cdr в SICP тоже хороше разжеваны: 3.5 Streams
Re[4]: [LINQ] cons, car, cdr
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 17.10.08 04:55
Оценка: 1 (1)
Здравствуйте, <Аноним>, Вы писали:

А>Для тех кто подзабыл Лисп напоминаю, что cons/car/cdr в нем используются для создания/работы со структурами не только типа "однотипный список", но и с любыми другими (в частности с иерархическими или, скажем, списками неоднородных элементов). Автор топика хотел увидеть имплементация именно базовых cons/car/cdr, а не случай их частного применения к однородному списку.


Голову включать тоже при этом стоит. Иначе действительно для решения примитивной задачи понадобится несколько экранов кода.

А>Hint: Попробуй проверить свое решение на вот таком расширенным примере:


Правильно, потому что лисп динамический язык. И твой вариант просто имитирует внешние эффекты, реально отличаясь от лиспа еще больше. На C# 4, возможно, получится действительно сделать более похоже, но смысла в этом ноль.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re: [LINQ] cons, car, cdr
От: yumi  
Дата: 17.10.08 08:28
Оценка:
Простейшая реализация примитивов Cons, Car, Cdr и List. Правда без Линка и ленивости, но зато видно, как устроены Лисповские списки изнутри. Просто тут в ветке вижу у людей путаница со списками. А вся правда в том, что в Лиспе нет списков, а есть пары и на основе пар, строятся списки, вот пример:
    class ConsObj
    {
        public object First  { get; private set; }
        public object Second { get; private set; }

        public ConsObj(object a, object b)
        {
            First = a;
            Second = b;
        }
    }

    class Program
    {
        static object Cons(object a, object b)
        {
            return new ConsObj(a, b);
        }

        static object Car(object a)
        {
            return ((ConsObj)a).First;
        }

        static object Cdr(object a)
        {
            return ((ConsObj)a).Second;
        }

        static object List(params object[] l)
        {
            if (l.Length == 1)
                return Cons(l[0], null);
            else
            {
                object[] last = new object[l.Length - 1];
                for (int i = 1; i < l.Length; i++)
                    last[i - 1] = l[i];

                return Cons(l[0], List(last));
            }
        }

        static void Main(string[] args)
        {
            object l = List(1, 2, 3);
            object f = Car(l);
            object s = Car(Cdr(l));
            object t = Car(Cdr(Cdr(l)));

            Console.WriteLine(f + " " + s + " " + t);
        }
    }
Lisp is not dead. It’s just the URL that has changed:
http://clojure.org
Re[3]: [LINQ] cons, car, cdr
От: Lloyd Россия  
Дата: 17.10.08 15:19
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>Конс — это конструктор связанного списка.


Не так. cons зосздает пару, а пара является списком только в том случае, если второй элемент — nil или список.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[4]: [LINQ] cons, car, cdr
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.10.08 18:51
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Не так. cons зосздает пару, а пара является списком только в том случае, если второй элемент — nil или список.


Прежде чем отвечать прочти всю тему: http://rsdn.ru/forum/message/3141182.1.aspx
Автор: VladD2
Дата: 17.10.08
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: [LINQ] cons, car, cdr
От: Lloyd Россия  
Дата: 18.10.08 11:55
Оценка:
Здравствуйте, VladD2, Вы писали:

L>>Не так. cons зосздает пару, а пара является списком только в том случае, если второй элемент — nil или список.


VD>Прежде чем отвечать прочти всю тему: http://rsdn.ru/forum/message/3141182.1.aspx
Автор: VladD2
Дата: 17.10.08


И что это изменит? После почтения cons как не создавал список, так его и не создает.
Re[6]: [LINQ] cons, car, cdr
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.10.08 16:50
Оценка: -1
Здравствуйте, Lloyd, Вы писали:

VD>>Прежде чем отвечать прочти всю тему: http://rsdn.ru/forum/message/3141182.1.aspx
Автор: VladD2
Дата: 17.10.08


L>И что это изменит? После почтения cons как не создавал список, так его и не создает.


Извини, я не подумал. Это действительно ничего в тебе не меняет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: [LINQ] cons, car, cdr
От: Lloyd Россия  
Дата: 19.10.08 00:28
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>>>Прежде чем отвечать прочти всю тему: http://rsdn.ru/forum/message/3141182.1.aspx
Автор: VladD2
Дата: 17.10.08


L>>И что это изменит? После почтения cons как не создавал список, так его и не создает.


VD>Извини, я не подумал. Это действительно ничего в тебе не меняет.


При чем тут я-то? Я не о себе говорю, а о твоей фразе:

Конс — это конструктор связанного списка.

Она вне зависимости от того, изменится что-либо во мне или нет, останется неверной.
Re[8]: [LINQ] cons, car, cdr
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.10.08 20:24
Оценка: -1
Здравствуйте, Lloyd, Вы писали:

L>При чем тут я-то?


Подумай.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: [LINQ] cons, car, cdr
От: _FRED_ Черногория
Дата: 20.10.08 06:31
Оценка:
Здравствуйте, Lloyd, Вы писали:

VD>>>>Прежде чем отвечать прочти всю тему: http://rsdn.ru/forum/message/3141182.1.aspx
Автор: VladD2
Дата: 17.10.08

L>>>И что это изменит? После почтения cons как не создавал список, так его и не создает.
VD>>Извини, я не подумал. Это действительно ничего в тебе не меняет.
L>При чем тут я-то? Я не о себе говорю, а о твоей фразе:

L>Конс — это конструктор связанного списка.

L>Она вне зависимости от того, изменится что-либо во мне или нет, останется неверной.

Да просто Влад уже осознал (в том топике, ссылку на который привёл), "что гонит", за девятнадцать часов до твоей поправки
Help will always be given at Hogwarts to those who ask for it.
Re[9]: [LINQ] cons, car, cdr
От: Lloyd Россия  
Дата: 20.10.08 08:51
Оценка:
Здравствуйте, _FRED_, Вы писали:

L>>Она вне зависимости от того, изменится что-либо во мне или нет, останется неверной.


_FR>Да просто Влад уже осознал (в том топике, ссылку на который привёл), "что гонит", за девятнадцать часов до твоей поправки


А чего хамить-то тогда, если сам же и лоханулся?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[6]: [LINQ] cons, car, cdr
От: Klapaucius  
Дата: 23.10.08 10:43
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>С хвостом проще, есть готовый метод Last.


Нет. Метод Last возвращает последний элемент последовательности, а хвост — это все элементы последовательности кроме первого.
... << RSDN@Home 1.2.0 alpha 4 rev. 1110>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re: [LINQ] cons, car, cdr
От: SE Украина  
Дата: 27.10.08 18:47
Оценка:
Здравствуйте, SE, Вы писали:

Наконец-то выдалась минутка написать код. Получилось без LINQ, совсем не лениво, ну и ладно. Зато без явного приведения типов.

using System;

namespace ConsTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var x = Cons.Create(1, 2);
            var y = Cons.Create(3, 4);
            var z = Cons.Create(x, y);
            Console.WriteLine(z.Car.Car); // 1
            Console.WriteLine(z.Cdr.Car); // 3
        }
    }

    public class Cons<T1, T2>
    {
        public Cons(T1 car, T2 cdr)
        {
            Car = car;
            Cdr = cdr;
        }
        public T1 Car { get; private set; }
        public T2 Cdr { get; private set; }
    }   

    public class Cons
    {
        public static Cons<T1, T2> Create<T1,T2>(T1 car, T2 cdr)
        {
            return new Cons<T1, T2>(car, cdr);
        }
    }
}


P.S. Вот, изучу линк как следует, тогда еще попробую
P.P.S. Да, классы назвал одинаково — фантазию заклинило
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.