Задача следующая, есть файл txt, нужно прочитать его, определить кол-во строк, вывести в консоль, и вывести каждую строчку, содержащую последовательность 'lisp' или 'LISP'
Как такое реализовать на Lisp? Может кто поделится бинарником и какой рантайм и откуда скачать для Windows?
Захотелось "увидеть живой LISP" после прочтения этого
Здравствуйте, <Аноним>, Вы писали:
А>Как такое реализовать на 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();
Рельное обеяснение тут пожалуй требует только строка:
strs.ToList() превращает массив возвращенный стандартной .net-ной фукнцией File.ReadAllLines() в список (односвязанный). Метод Filter() в соотвествии со своим именем отфильтровывает элементы списка удовлетворяющие условию. Условие передается в виде фукнции через параметр. Собственно то что можно передавать фукнции в качестве параметра — это и есть функциональный стиль. Но это можно сделать и в C# 2.0.
А вот '_.Contains(strToFind)' это пожалу самое интересное.
Это так называемое частичное применение функций, да еще и с замыканием. Этот код заменяется на создание невидимой (анонимной) функции. Эта функция захватывает переменную strToFind из контекста где она определена. Знак "_" заменяется параметром этой анонимной функции. Таким образом написав '_.Contains(strToFind)' мы получаем функцию принимающую один аргумент типа "строка" и возращающую булево выражение. То что тип аргумента строка компилятор вычисляет из контекста куда должна передаваться фукнция, а то чт возвращаемое значение должно быть булевым выясняется из возвращаемого значения функции Contains().
Это код можно переписать более явно (и естественно более громоздко):
данный вариант соотвествует тому что будет доступно в 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>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
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>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Задача следующая, есть файл 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
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, <Аноним>, Вы писали:
А>>Как такое реализовать на Lisp? Может кто поделится бинарником и какой рантайм и откуда скачать для Windows?
VD>А ты возьми Nemerle. Если знаешь дотнет, то и вопросы задавать в основном не прийдется.
Не знаю и не хочу, разбираюсь с жабкой, хочу Scala & Groovy потом пошшупать
Задача следующая, есть файл txt, нужно прочитать его, определить кол-во строк, вывести в консоль, и вывести каждую строчку, содержащую последовательность 'lisp' или 'LISP'
А>Как такое реализовать на Lisp? Может кто поделится бинарником и какой рантайм и откуда скачать для Windows?
В наш век Гуглов и Википедий странно задавать такие вопросы. Почему бы просто не пойти, скажем, сюда.
А>Захотелось "увидеть живой LISP" после прочтения этого
здесь можешь посмотреть на реализации маленьких программулек на разных языках (в т.ч. Lisp и Rebol).
Но если реально хочется поднапрячь мозги, то я бы за Haskell лучше взялся
Re[2]: Файл
От:
Аноним
Дата:
18.09.06 09:57
Оценка:
Здравствуйте, Андрей Хропов, Вы писали:
А>>Как такое реализовать на Lisp? Может кто поделится бинарником и какой рантайм и откуда скачать для Windows?
АХ>В наш век Гуглов и Википедий странно задавать такие вопросы. Почему бы просто не пойти, скажем, сюда.
(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)))
Здравствуйте, <Аноним>, Вы писали:
А>Не знаю и не хочу, разбираюсь с жабкой, хочу Scala & Groovy потом пошшупать
Кто-то тебе советовал Яву? Скала тоже хороший кандат. Но если ты не знаком с Явой или дотнетом, то его будет освоить несколько сложенее. Груви же это скриптовый язык на базе платформы Ява. По-моему, он вообще мало интересен.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Задача следующая, есть файл txt, нужно прочитать его, определить кол-во строк, вывести в консоль, и вывести каждую строчку, содержащую последовательность 'lisp' или 'LISP'
А>Как такое реализовать на Lisp? Может кто поделится бинарником и какой рантайм и откуда скачать для Windows?
Common Lisp, с командной строки наименование файла.
интересуюсь. Practical CL тоже уже скачал
Я бы предложил качнуть "Gentle Inroduction to Symbolic Computation". (с гугля быстро находится, ща с нетом временно проблемы, поэтому не сцылка)
Здравствуйте, 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 Kurkov, Вы писали: MK> Вот правильный запрос первая же ссылка ведет в нужное место. Семен Семеныч. Я с минуту искал разницу в урлах, закрадывалось подозрение, что Гугл предпочитает оперу.
Всем приношу извинения за шум на линии .
Задача следующая, есть файл txt, нужно прочитать его, определить кол-во строк, вывести в консоль, и вывести каждую строчку, содержащую последовательность 'lisp' или 'LISP'
А>>Как такое реализовать на Lisp? Может кто поделится бинарником и какой рантайм и откуда скачать для Windows?
TBG>Common Lisp, с командной строки наименование файла. Все получилось.
Задача следующая, есть файл txt, нужно прочитать его, определить кол-во строк, вывести в консоль, и вывести каждую строчку, содержащую последовательность 'lisp' или 'LISP'
А>Как такое реализовать на Lisp? Может кто поделится бинарником и какой рантайм и откуда скачать для Windows?
В учебных целях я пользуюсь MIT/GNU Scheme. Можно запросто найти в гугле.
Буду рад, если гуру сайта это дело покритикуют. В частности, волнует вопрос: почему в MIT Scheme так мало функция для работы с потоками? Кстати, как мне в filter-stream побороть хвостовую рекурсию?
K>Кстати, как мне в filter-stream побороть хвостовую рекурсию?
Что-то я переработал. Конечно же, хвостовую рекурсию обнаруживает интерпретатор . А в даннм случае как раз она и будет. Ведь я создаю поток. Т.е. там, где у меня cons-stream функция filter-stream не будет вызвана рекурсивно. Просто её вызов будет сохранён как лямбда. Соответственно, эта лямбда будет реально вызвана при трасформации потока в список (точнее, будет создано много лямбд и каждая будет вызвана).