Файл
От: Аноним  
Дата: 17.09.06 19:59
Оценка:
Скажем, http://rsdn.ru/Forum/Message.aspx?mid=1087883&only=1
Автор: VxCall
Дата: 23.03.05
Задача следующая, есть файл txt, нужно прочитать его, определить кол-во строк, вывести в консоль, и вывести каждую строчку, содержащую последовательность 'lisp' или 'LISP'

Как такое реализовать на Lisp? Может кто поделится бинарником и какой рантайм и откуда скачать для Windows?

Захотелось "увидеть живой LISP" после прочтения этого
Автор:
Дата: 09.07.05
Тут http://rsdn.ru/Forum/Message.aspx?mid=2104773#2104773
Автор: Сергей Туленцев
Дата: 12.09.06
ушли куда-то в теорию
Re: Файл
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.09.06 01:53
Оценка: 28 (2) -3
Здравствуйте, <Аноним>, Вы писали:

А>Как такое реализовать на Lisp? Может кто поделится бинарником и какой рантайм и откуда скачать для Windows?


А ты возьми Nemerle. Если знаешь дотнет, то и вопросы задавать в основном не прийдется. А то с Лиспом у тебя порог вхождения будет очень высок. Придется разбираться не только с функциональным стилем и его скобками, но и с незнакомыми средами, компиляторами, библиотеками...

А тут можно с места, и как говорится, в карьер.

Код может выглядить, например, так:
using System.Console;
using Nemerle.Utility;
using System.IO;

def strToFind = "partition";
def strs = File.ReadAllLines(@"C:\boot.ini");
WriteLine($"Lines in file: $(strs.Length)");
WriteLine();
WriteLine($"Lines contained '$strToFind':");
WriteLine(strs.ToList().Filter(_.Contains(strToFind)));
ReadLine();

Рельное обеяснение тут пожалуй требует только строка:
WriteLine(strs.ToList().Filter(_.Contains("partition")));

strs.ToList() превращает массив возвращенный стандартной .net-ной фукнцией File.ReadAllLines() в список (односвязанный). Метод Filter() в соотвествии со своим именем отфильтровывает элементы списка удовлетворяющие условию. Условие передается в виде фукнции через параметр. Собственно то что можно передавать фукнции в качестве параметра — это и есть функциональный стиль. Но это можно сделать и в C# 2.0.

А вот '_.Contains(strToFind)' это пожалу самое интересное.
Это так называемое частичное применение функций, да еще и с замыканием. Этот код заменяется на создание невидимой (анонимной) функции. Эта функция захватывает переменную strToFind из контекста где она определена. Знак "_" заменяется параметром этой анонимной функции. Таким образом написав '_.Contains(strToFind)' мы получаем функцию принимающую один аргумент типа "строка" и возращающую булево выражение. То что тип аргумента строка компилятор вычисляет из контекста куда должна передаваться фукнция, а то чт возвращаемое значение должно быть булевым выясняется из возвращаемого значения функции Contains().

Это код можно переписать более явно (и естественно более громоздко):
WriteLine(strs.ToList().Filter(elem => elem.Contains(strToFind)));

данный вариант соотвествует тому что будет доступно в C# 3.0.

А чтобы код уж совсем стал похож на традиционные императивные языки можно переписать его так:
using System.Console;
using Nemerle.Utility;
using System.IO;

def strToFind = "partition";
def strs = File.ReadAllLines(@"C:\boot.ini");
WriteLine($"Lines in file: $(strs.Length)");
WriteLine();
WriteLine($"Lines contained '$strToFind':");
foreach (str in strs)
    when (str.Contains(strToFind))
        WriteLine(str);
ReadLine();
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Файл
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.09.06 02:09
Оценка: 6 (1) -1
Здравствуйте, VladD2, Вы писали:

А вот еще один завбаный вариант в стиле Хаскеля.
using System.Console;
using Nemerle.Utility;
using System.IO;

def strToFind = "partition";
def strs = File.ReadAllLines(@"C:\boot.ini");
WriteLine($"Lines in file: $(strs.Length)");
WriteLine();
WriteLine($"Lines contained '$strToFind':"); 
WriteLine($[ x | x in strs, x.Contains(strToFind) ]);
ReadLine();
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Файл
От: FR  
Дата: 18.09.06 05:37
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Скажем, http://rsdn.ru/Forum/Message.aspx?mid=1087883&amp;only=1
Автор: VxCall
Дата: 23.03.05
Задача следующая, есть файл txt, нужно прочитать его, определить кол-во строк, вывести в консоль, и вывести каждую строчку, содержащую последовательность 'lisp' или 'LISP'


Для таких задачек гораздо удобнее использовать Rebol (сильно мутировавший ротомок лиспа )
REBOL []  ;ищем "LISP"
len: 0 foreach line read/lines %find_tst.r [len: len + 1 if find line  "lisp" [print line]] 
probe len
Re[2]: Файл
От: Аноним  
Дата: 18.09.06 07:34
Оценка: +2 :)
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, <Аноним>, Вы писали:


А>>Как такое реализовать на Lisp? Может кто поделится бинарником и какой рантайм и откуда скачать для Windows?


VD>А ты возьми Nemerle. Если знаешь дотнет, то и вопросы задавать в основном не прийдется.


Не знаю и не хочу, разбираюсь с жабкой, хочу Scala & Groovy потом пошшупать
Re[2]: Файл
От: _rasta  
Дата: 18.09.06 09:18
Оценка: +2 :))) :))
Здравствуйте, VladD2, Вы писали:

А>>Как такое реализовать на Lisp?

VD>А ты возьми Nemerle.

а я думал пишут "нинаю". или просто оставляют без комментариев.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Файл
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 18.09.06 09:48
Оценка:
_rasta,

А>>>Как такое реализовать на Lisp?

VD>>А ты возьми Nemerle.
_>а я думал пишут "незнаю". или просто оставляют без комментариев.

Зато программа простая и понятна даже с неявной лямбдой.
Правда, вот сейчас тоже думаю: "Действительно, при чём здесь N?..."
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re: Файл
От: Андрей Хропов Россия  
Дата: 18.09.06 09:54
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Скажем, http://rsdn.ru/Forum/Message.aspx?mid=1087883&amp;only=1
Автор: VxCall
Дата: 23.03.05
Задача следующая, есть файл txt, нужно прочитать его, определить кол-во строк, вывести в консоль, и вывести каждую строчку, содержащую последовательность 'lisp' или 'LISP'


А>Как такое реализовать на Lisp? Может кто поделится бинарником и какой рантайм и откуда скачать для Windows?


В наш век Гуглов и Википедий странно задавать такие вопросы. Почему бы просто не пойти, скажем, сюда.

А>Захотелось "увидеть живой LISP" после прочтения этого
Автор:
Дата: 09.07.05
Тут http://rsdn.ru/Forum/Message.aspx?mid=2104773#2104773
Автор: Сергей Туленцев
Дата: 12.09.06
ушли куда-то в теорию


здесь можешь посмотреть на реализации маленьких программулек на разных языках (в т.ч. Lisp и Rebol).

Но если реально хочется поднапрячь мозги, то я бы за Haskell лучше взялся
Re[2]: Файл
От: Аноним  
Дата: 18.09.06 09:57
Оценка:
Здравствуйте, Андрей Хропов, Вы писали:

А>>Как такое реализовать на Lisp? Может кто поделится бинарником и какой рантайм и откуда скачать для Windows?


АХ>В наш век Гуглов и Википедий странно задавать такие вопросы. Почему бы просто не пойти, скажем, сюда.


То есть, закрываем rsdn? Ведь Гоголь с Викой есть. Тем более не я один http://rsdn.ru/forum/Message.aspx?mid=2104773&amp;only=1
Автор: Сергей Туленцев
Дата: 12.09.06
интересуюсь. Practical CL тоже уже скачал
Re: Файл
От: Аноним  
Дата: 18.09.06 10:55
Оценка: 18 (2)
(with-open-file (f ".bash_history")
  (loop for l = (read-line f nil nil)
        for count upfrom 0
        while l when (search "lisp" l) collect l into lines
        finally (format t "Lines in file: ~A~%Lines:~%~{~A~%~}" count lines)))
Re[3]: Файл
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.09.06 11:02
Оценка:
Здравствуйте, _rasta, Вы писали:

_>а я думал пишут "нинаю". или просто оставляют без комментариев.



Хороший совет. Придерживайся его.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Файл
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.09.06 11:02
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Не знаю и не хочу, разбираюсь с жабкой, хочу Scala & Groovy потом пошшупать


Кто-то тебе советовал Яву? Скала тоже хороший кандат. Но если ты не знаком с Явой или дотнетом, то его будет освоить несколько сложенее. Груви же это скриптовый язык на базе платформы Ява. По-моему, он вообще мало интересен.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Файл
От: Turtle.BAZON.Group  
Дата: 20.09.06 11:18
Оценка: 32 (3)
Здравствуйте, <Аноним>, Вы писали:

А>Скажем, http://rsdn.ru/Forum/Message.aspx?mid=1087883&amp;only=1
Автор: VxCall
Дата: 23.03.05
Задача следующая, есть файл txt, нужно прочитать его, определить кол-во строк, вывести в консоль, и вывести каждую строчку, содержащую последовательность 'lisp' или 'LISP'


А>Как такое реализовать на Lisp? Может кто поделится бинарником и какой рантайм и откуда скачать для Windows?


Common Lisp, с командной строки наименование файла.

(defun file-read (file-name compiled-pattern)
  (with-open-file (rstream file-name)
    (do ((line (read-line rstream) (read-line rstream nil 'eof))
     (line-count 0 (+ 1 line-count))
     (line-list ()))
      ((equal line 'eof) (values-list (list line-count (reverse line-list))))
      (if (regexp:regexp-exec compiled-pattern line)
    (push line line-list)))))

(multiple-value-bind (line-count line-list)
  (file-read (first *ARGS*) (regexp:regexp-compile "\\(lisp\\|LISP\\)"))
  (format t "~&Строк всего: ~D~%" line-count)
  (format t "~&Строки, содержащие шаблон поиска:~%")
  (dolist (line line-list)
    (format t "~&~A~%" line)))
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Файл
От: Turtle.BAZON.Group  
Дата: 20.09.06 13:34
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>То есть, закрываем rsdn? Ведь Гоголь с Викой есть. Тем более не я один http://rsdn.ru/forum/Message.aspx?mid=2104773&amp;only=1
Автор: Сергей Туленцев
Дата: 12.09.06
интересуюсь. Practical CL тоже уже скачал

Я бы предложил качнуть "Gentle Inroduction to Symbolic Computation". (с гугля быстро находится, ща с нетом временно проблемы, поэтому не сцылка)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Файл
От: Programmierer AG  
Дата: 20.09.06 16:07
Оценка:
Здравствуйте, Turtle.BAZON.Group, Вы писали:

TBG>Я бы предложил качнуть "Gentle Inroduction to Symbolic Computation". (с гугля быстро находится, ща с нетом временно проблемы, поэтому не сцылка)

Странно, у меня запрос выдает 16 ссылок, из них по теме 2:
http://ed-thelen.org/comp-hist/Book-Catalog.html — офлайновый каталог
http://www.nalanda.nitc.ac.in/resources/cse/ebooks/Introduction_Symbolic_Computation.pdf — требует пароль.

Возможно, есть в осле и подобных сетях, но насчет "легко находится гуглом" — преувеличение.
Re[5]: Файл
От: Mikl Kurkov Россия  
Дата: 20.09.06 16:25
Оценка: 14 (1) +2 :)
Здравствуйте, Programmierer AG, Вы писали:

PA>Здравствуйте, Turtle.BAZON.Group, Вы писали:


TBG>>Я бы предложил качнуть "Gentle Inroduction to Symbolic Computation". (с гугля быстро находится, ща с нетом временно проблемы, поэтому не сцылка)

PA>Странно, у меня запрос выдает 16 ссылок, из них по теме 2:
PA>http://ed-thelen.org/comp-hist/Book-Catalog.html — офлайновый каталог
PA>http://www.nalanda.nitc.ac.in/resources/cse/ebooks/Introduction_Symbolic_Computation.pdf — требует пароль.

PA>Возможно, есть в осле и подобных сетях, но насчет "легко находится гуглом" — преувеличение.



Вот правильный запрос первая же ссылка ведет в нужное место.

--
Mikl
Re[6]: Файл
От: Programmierer AG  
Дата: 21.09.06 07:24
Оценка:
Здравствуйте, Mikl Kurkov, Вы писали:
MK> Вот правильный запрос первая же ссылка ведет в нужное место.
Семен Семеныч. Я с минуту искал разницу в урлах, закрадывалось подозрение, что Гугл предпочитает оперу.
Всем приношу извинения за шум на линии .
Re[2]: Файл
От: Аноним  
Дата: 21.09.06 20:17
Оценка:
Здравствуйте, Turtle.BAZON.Group, Вы писали:

TBG>Здравствуйте, <Аноним>, Вы писали:


А>>Скажем, http://rsdn.ru/Forum/Message.aspx?mid=1087883&amp;only=1
Автор: VxCall
Дата: 23.03.05
Задача следующая, есть файл txt, нужно прочитать его, определить кол-во строк, вывести в консоль, и вывести каждую строчку, содержащую последовательность 'lisp' или 'LISP'


А>>Как такое реализовать на Lisp? Может кто поделится бинарником и какой рантайм и откуда скачать для Windows?


TBG>Common Lisp, с командной строки наименование файла.

Все получилось.
Re: Файл
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 21.09.06 20:58
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Скажем, http://rsdn.ru/Forum/Message.aspx?mid=1087883&amp;only=1
Автор: VxCall
Дата: 23.03.05
Задача следующая, есть файл txt, нужно прочитать его, определить кол-во строк, вывести в консоль, и вывести каждую строчку, содержащую последовательность 'lisp' или 'LISP'


А>Как такое реализовать на Lisp? Может кто поделится бинарником и какой рантайм и откуда скачать для Windows?


В учебных целях я пользуюсь MIT/GNU Scheme. Можно запросто найти в гугле.

Вот здесь
Автор: Astaroth
Дата: 07.01.05
есть ссылки на доки (спасибо товарищу с работы ).

Сам как раз изучаю Лисп. Спасибо за подкинутую задачку. Вот что-то подобное наваял:

; Формирует список строк.
(define (lines-list filename)
    (define (line-list-iter input-port lines)
        (let (
                (line (read-line input-port))
            )
            (cond
                ((eof-object? line) (begin (close-port input-port) lines))
                (else (cons-stream line (line-list-iter input-port lines)))
            )
        )
    )    
    (line-list-iter (open-input-file filename) (stream))
)

; Аналог filter для потоков. Почему-то отсутсвует в MIT Scheme.
(define (filter-stream f s)
    (cond
        ((stream-null? s) (stream))
        (else
            (if (f (stream-car s))
                (cons-stream (stream-car s) (filter-stream f (stream-cdr s)))
                (filter-stream f (stream-cdr s))
            )
        )
    )
)

; Фильтрует строки из списка по наличию в них подстроки "Lisp".
(define (lisp-lines-list filename)
    (filter-stream
        (lambda (e) (substring? "Lisp" e))
        (lines-list filename)
    )
)

(define (lisp-lines-count filename)
    (stream-length (lisp-lines-list filename))
)

(define (main filename)
    (display (stream->;list (lisp-lines-list filename)))
    (display "\n")
    (display (lisp-lines-count filename))
    'ok
)


Буду рад, если гуру сайта это дело покритикуют. В частности, волнует вопрос: почему в MIT Scheme так мало функция для работы с потоками? Кстати, как мне в filter-stream побороть хвостовую рекурсию?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Файл
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 22.09.06 04:44
Оценка:
K>Кстати, как мне в filter-stream побороть хвостовую рекурсию?

Что-то я переработал. Конечно же, хвостовую рекурсию обнаруживает интерпретатор . А в даннм случае как раз она и будет. Ведь я создаю поток. Т.е. там, где у меня cons-stream функция filter-stream не будет вызвана рекурсивно. Просто её вызов будет сохранён как лямбда. Соответственно, эта лямбда будет реально вызвана при трасформации потока в список (точнее, будет создано много лямбд и каждая будет вызвана).
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.