Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Автор канал по Лиспу
 Аватар для Regrin1
25 / 23 / 2
Регистрация: 10.08.2021
Сообщений: 357

Итератор по строкам файла

18.06.2022, 21:48. Показов 493. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, скажите пожалуйста, можно ли провести итерацию по строкам файла, или по содержащимся в нём S-выражениям?
Например:
Lisp
1
2
(loop for line vnytri file by lines
          collect (parse-integer line)
Я понимаю, что конкретно этот пример работать не будет, но может есть вариант? А то неудобно использовать такую конструкцию (взял у Грэм, ANSI Common Lisp Гл 7.2):
Lisp
1
2
3
4
5
6
(defun pseudo-cat (file)
    (with-open-file (str file :direction :input)
        (do ((line (read-line str nil ’eof)
                   (read-line str nil ’eof)))
            ((eql line ’eof))
            (format t "~A~%" line))))
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.06.2022, 21:48
Ответы с готовыми решениями:

Реализовать двусвязный список (list), итератор (iterator) и константный итератор (сonst_iterator) для списка
не могу понять что должно быть результатом. может подскажете примеры? пожалуйста. Задание: Реализовать двусвязный список (list),...

Особый итератор словаря. Итератор возвращающий нужные комбинации
Немогу разобраться, как написать итератор. У меня есть словарь, ключи это координаты, а значения это либо ноль, либо единичка (True и...

ООП на С++. Нужно уже готовый итератор изменить так, чтобы был использован итератор из библиотеки СТЛ
Iterator.h /* This class represent an iterator which will go through the Array container */ #pragma once #include...

11
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
19.06.2022, 00:35
Мне обычно хватает что-нибудь типа
Lisp
1
2
3
4
(with-open-file (in ...)
  (loop for line = (read-line in nil)
        while line
        do ...))
С s-выражениями нужен более хитрый признак конца ввода. Пример Грэма некорректно работает, если в файле есть выражение eof. Можно вместо символа использовать генсим или свежую конс-ячейку:
Lisp
1
2
3
4
5
6
(with-open-file (in ...)
  (with-standard-io-syntax
    (loop with eof = (cons nil nil)
          for sexpr = (read in nil eof)
          until (eq sexpr eof)
          do ...)))
Добавлено через 1 час 59 минут
Забыл написать: в iterate есть драйверы in-file и in-stream: https://iterate.common-lisp.de... -Iteration

Lisp
1
2
3
4
5
6
7
(iter
  (for expr in-file "foo.lisp")
  (print expr))
 
(iter
  (for line in-file "foo.txt" using #'read-line)
  (write-line line))
3
217 / 212 / 8
Регистрация: 09.06.2019
Сообщений: 240
Записей в блоге: 1
19.06.2022, 12:19
helter, я почитал про пакет iterate, он очень интересен и в принцие, как там написано, призван заменить макрос loop, в силу того что он имеет не лисповский синтаксис.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38196 / 21129 / 4309
Регистрация: 12.02.2012
Сообщений: 34,737
Записей в блоге: 14
19.06.2022, 19:46
В HomeLisp текстовые файлы итерируются без проблем:

Lisp
1
(iter (for stri in-file "12345678.txt") (printsline stri))
0
217 / 212 / 8
Регистрация: 09.06.2019
Сообщений: 240
Записей в блоге: 1
20.06.2022, 08:06
Catstail, а Вы пользуетесь тем же пакетом iterate или у вас собственная реализация?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38196 / 21129 / 4309
Регистрация: 12.02.2012
Сообщений: 34,737
Записей в блоге: 14
20.06.2022, 10:05
IisNuINu, к сожалению, у меня собственная реализация некоторого подмножества iter
0
217 / 212 / 8
Регистрация: 09.06.2019
Сообщений: 240
Записей в блоге: 1
20.06.2022, 10:46
Catstail, почему же к сожалению? у реализации iterate я заметил, свои проблемы, может быть я не прав и меня поправят, но когда я попытался импортировать символы из iterate в основной пакет common lisp user у меня сразу возник конфликт имен с until, да и с символом for наверняка будут проблемы.
я код не смотрел, но подозреваю что все они реализованы как отдельные макросы. и можно ли их применять без iter я не знаю.

Добавлено через 42 секунды
а применять с без импортирования с постоянным указыванием пакета, не очень удобно.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38196 / 21129 / 4309
Регистрация: 12.02.2012
Сообщений: 34,737
Записей в блоге: 14
20.06.2022, 11:00
Цитата Сообщение от IisNuINu Посмотреть сообщение
Catstail, почему же к сожалению?
- HomeLisp имеет низкую производительность (сказывается интерпретация и язык ядра - VB). Поэтому крупные макро работают очень медленно... Но хотелось иметь возможности iter. Я его встроил в ядро. Что Несколько противоречит духу Лиспа.
0
217 / 212 / 8
Регистрация: 09.06.2019
Сообщений: 240
Записей в блоге: 1
20.06.2022, 13:11
Catstail, я думаю расстраиваться не стоит. современный лисп в виде sbcl тоже возник не сразу, от тоже был долго интерпретируемым и медленным.
1
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
20.06.2022, 13:12
Цитата Сообщение от IisNuINu Посмотреть сообщение
helter, я почитал про пакет iterate, он очень интересен и в принцие, как там написано, призван заменить макрос loop, в силу того что он имеет не лисповский синтаксис.
Ну да... Что кому нравится, то и использует. Существенное достоинство iterate - можно писать свои драйверы.

Цитата Сообщение от IisNuINu Посмотреть сообщение
когда я попытался импортировать символы из iterate в основной пакет common lisp user у меня сразу возник конфликт имен с until, да и с символом for наверняка будут проблемы.
Точно? Если вот так сделать:
Lisp
1
(defpackage #:my-package (:use #:cl #:iterate))
конфликтов быть не должно.

Для loop сами символы не имеют значения, важны только их имена. Поэтому loop сразу работает в любом пакете. Некоторые предпочитают использовать в loop кейворды, чтобы не добавлять лишние символы в свой пакет: (loop :for i :from 1 :to 10 :do...)

В iterate важны сами символы, поэтому пакет нужно use-ать. С пакетом COMMON-LISP (он же CL) конфликтов у него нет. С пакетом COMMON-LISP-USER конфликтов у него по идее быть не должно. Хотя гарантии нет, потому что реализации могут добавлять в COMMON-LISP-USER какие захотят символы. Но мне всё равно сомнительно, что прямо из коробки будет конфликт. Конфликт вероятен в таком интерактивном сценарии: я работаю в COMMON-LISP-USER; вычисляю какое-то выражение с until, так что этот символ интернится; делаю (use-package "ITERATE") и получаю конфликт until из iterate и того until, который был прочитан с клавиатуры. В таком случае достаточно выбрать рестарт "take new".
1
217 / 212 / 8
Регистрация: 09.06.2019
Сообщений: 240
Записей в блоге: 1
20.06.2022, 18:58
Цитата Сообщение от helter Посмотреть сообщение
я работаю в COMMON-LISP-USER; вычисляю какое-то выражение с until, так что этот символ интернится; делаю (use-package "ITERATE") и получаю конфликт until из iterate и того until, который был прочитан с клавиатуры.
да, практически так и произошло. я подумал что возможно импортирование задевает какой то важный макрос, поэтому про это на всякий случай написал. Спасибо что указал, как правильно использовать пакет. вещь хорошая, надо пользоваться. я макрос loop не очень люблю. а тут все очень красиво.
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
21.06.2022, 20:10
Цитата Сообщение от helter Посмотреть сообщение
Пример Грэма некорректно работает, если в файле есть выражение eof.
В смысле, пример Грэма работает, конечно, корректно, просто там нельзя заменить read-line на read.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.06.2022, 20:10
Помогаю со студенческими работами здесь

Особый итератор словаря. Медленный итератор
Не могу разобраться, как написать итератор. У меня есть словарь, ключи это координаты, а значения это либо ноль, либо единичка (True и...

Чтение файла, как сделать прогон по всем строкам файла
Вот вообщем задание: Составить текстовый файл, состоящий из нескольких строк следующего вида:<количество чисел в строке> <число...

Считать с файла числа через итератор потока
Не хочет считывать с файла целые числа, что я делаю не так? #include <iostream> #include <fstream> #include <iterator>...

Cтрока: Взять строки из первого файла и к строкам с чётным номером выполнить конкатенацию второй строки второго файла
Имеется два файла .text.В первом содержится n количество строк, Последний элемент строки её номер . Второй файл содержит две строки...

Чтение файла по строкам
Имеется файл 1.txt, в котором нходятся варианты первого вопроса. Заранее не известно количество вариантов вопроса. Каждые пять строк...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru