Форум программистов, компьютерный форум, киберфорум
Наши страницы

Lisp

Войти
Регистрация
Восстановить пароль
 
Slenon
2 / 2 / 0
Регистрация: 25.07.2016
Сообщений: 92
#1

О вводе строки, и выводе её модификации - Lisp

24.07.2017, 16:10. Просмотров 373. Ответов 12

Мне просто нужен код делающий следующее:
При начале работы выводится приглашение (например Vvedite slovo:)
Я ввожу Slenon, нажимаю Enter - выводится Privet, Slenon!
(Common LISP)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.07.2017, 16:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос О вводе строки, и выводе её модификации (Lisp):

Ошибка в потоковом вводе/выводе - C (Си)
Условие задачи не соответствует решению. Что не так? Вот условие и программа : Напишите программу, к-я по желанию пользователя вычисляет ...

Помощь в вводе и выводе программы - Delphi
Есть задание Написать программу,которая вводит символьный массив из 13-ти или меньшего количества элементов и строит другой массив, который...

Русский язык в вводе/выводе - C++
с помощью функции setlocale(0, "rus"); Программа понимает русский язык, который написан в кавычках, но как сделать, что-бы Стринговская...

Ошибка в вводе/выводе массива - C++
При выводе элемента массива всегда значение ноль. Вероятно ввожу массив неправильно. Помогите пожалуйста найти ошибку. P.S. жел-но не...

много вопросов о вводе-выводе - C++
Здравствуйте, законченный дельфист решил переехать... вопросов куча, просьба ответить. 1) много вариантов ввода вывода, например...

Не совпадает формат даты при вводе и выводе - C# ASP.NET
Есть такой файлик: <HTML> <% Session.LCID=1049 Response.Write 'Today is:' & Now() & ' ' Response.Write...

12
helter
Эксперт по математике/физике
3613 / 2639 / 267
Регистрация: 12.03.2013
Сообщений: 4,839
24.07.2017, 16:41 #2
Вот интересующая вас функция:
Lisp
1
2
3
4
5
6
7
8
(defun hello ()
  (format *query-io* "~&Как вас зовут?~%")
  (finish-output *query-io*)
  (format *query-io* "Привет, ~A!~%" (let ((reply (read-line *query-io* nil)))
                                       (cond ((null reply) "чувак")
                                             ((zerop (length reply)) "никто")
                                             (t reply))))
  (finish-output *query-io*))
Как вы будете её использовать — другой вопрос. Например, можете сохранить образ SBCL в виде бинарника, указав hello в качестве точки входа.
1
Catstail
Модератор
22838 / 11204 / 1812
Регистрация: 12.02.2012
Сообщений: 18,444
25.07.2017, 15:03 #3
HomeLisp:

Lisp
1
2
3
(defun hello nil
  (let ((name (ask "Как вас зовут?")))
       (say (strCat "Привет " name " !"))))
0
Slenon
2 / 2 / 0
Регистрация: 25.07.2016
Сообщений: 92
25.07.2017, 17:27  [ТС] #4
Уважаемый helter, Вы прямо испугали меня своим кодом! Ведь я в LISP совершенный 0 (был).
Мне то требовалось примерно следующее:
Lisp
1
2
3
4
(defun hello ()
  (format t "Kak Vas zovut? ")
  (let ((Imyi (read)))
  (format t "Privet, ~A!" Imyi)))
Наваял я это с "помощью" Пола Грэма ...
P.S. Уважаемый Catstail, свой код я написал по времени раньше чем 16.00,
но, всё равно спасибо!
0
helter
Эксперт по математике/физике
3613 / 2639 / 267
Регистрация: 12.03.2013
Сообщений: 4,839
25.07.2017, 17:57 #5
Да ладно. Просто он у меня был готовый, для тестов использовал.

Ваш код может работать, может не работать.

Искаробочное общение с пользователем в лиспе, мягко говоря громоздкое.

В лиспе есть несколько стандартных потоков ввода-вывода. В частносит, есть однонаправленные *standard-input*, *standard-output* и *error-output*, соответствующие юниксовым. Ещё есть специальный двунаправленный поток *query-io*, который CLHS предписывает для общения с пользователем. Поэтому я и использовал его. А вы выводите в стандартный вывод (когда пишете format t) и читаете из стандартного ввода (когда не указываете явно поток ввода для read).

Ещё есть такая штука, как буферизация, которая может быть, а может не быть. Для вашего кода я ожидал бы, что SBCL молча бы просил ввода имени, а вопрос задал бы в конце работы программы. Если вы хотите, чтобы данные действительно пошли по потоку, нужно протолкнуть их с помощью finish-output или force-output.

Функция read используется для чтения S-выражений. То есть это ридер, причём небезопасный. Чтобы прочитать строку или литеру, лучше использовать соответственно read-line и read-char.

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

Что лисп не очень-то дружелюбен к новичкам ― это притча во языцех. Не давайте ему себя запугать.

Добавлено через 33 секунды
Цитата Сообщение от Slenon Посмотреть сообщение
Imyi
Лучше писать всё маленькими.
0
budden
134 / 92 / 2
Регистрация: 16.08.2015
Сообщений: 175
26.07.2017, 11:14 #6
Обычно вы можете писать в лиспе кириллицей (во всяком случае это так в Lispworks и SBCL). Кроме того, у вас отступ неправильно выставлен. Без правильного отступа в лиспе практически невозможно разобраться из-за обилия скобок. Обычно с лиспом работают в среде разработки, которая обязательно умеет расставлять отступы согласно расстановке скобок. Получится как-то так:
Lisp
1
2
3
4
5
6
(defun приветствие ()
  (princ "Как вас зовут? ")
  (finish-output)
  (let ((имя (read-line)))
    (format t "Привет, ~A!~%" имя)
    (finish-output)))
Насчёт того, нужно ли использовать *query-io* или здесь хватит стандартного ввода-вывода, не скажу - это явно зависит от контекста.
0
helter
Эксперт по математике/физике
3613 / 2639 / 267
Регистрация: 12.03.2013
Сообщений: 4,839
26.07.2017, 16:35 #7
Цитата Сообщение от budden Посмотреть сообщение
это явно зависит от контекста
Согласен, что контекст важен. Потому что *standard-input* и иже с ним не потоки, а динамические переменные, изначально связанные со стандартными потоками. С чем они будут связаны в момент вызова функции, вообще говоря, неизвестно. Поэтому версия, в которой общение с пользователем осуществляется с помощью двустороннего потока, специально предназначенного для общения с пользователем, априори кажется мне менее подверженной глюкам.
1
nullxdth
1266 / 476 / 43
Регистрация: 12.03.2013
Сообщений: 2,354
26.07.2017, 23:59 #8
Цитата Сообщение от Slenon Посмотреть сообщение
Наваял я это с "помощью" Пола Грэма ...
Фига себе. Прямо связался с Грэмом и он подсказал?!
0
Slenon
2 / 2 / 0
Регистрация: 25.07.2016
Сообщений: 92
27.07.2017, 21:34  [ТС] #9

Естественно с помощью книжки ...
Кстати, книжка Питера Сайбеля для первого
знакомства с LISP подходит плохо ...
0
Lambdik
1028 / 922 / 104
Регистрация: 04.11.2012
Сообщений: 967
Записей в блоге: 2
27.07.2017, 22:43 #10
Цитата Сообщение от Slenon Посмотреть сообщение
Кстати, книжка Питера Сайбеля для первого
знакомства с LISP подходит плохо
Конечно. Кстати как Питер, так и Пол, знали у же по нескольку языков, когда принимались за Lisp.
0
nullxdth
1266 / 476 / 43
Регистрация: 12.03.2013
Сообщений: 2,354
28.07.2017, 11:52 #11
Цитата Сообщение от Slenon Посмотреть сообщение
Кстати, книжка Питера Сайбеля для первого
знакомства с LISP подходит плохо ...
Хм. Почему?
0
Slenon
2 / 2 / 0
Регистрация: 25.07.2016
Сообщений: 92
28.07.2017, 20:24  [ТС] #12
Уважаемый nullxdth, в "Практическом использовании ..." мне сильно не понравилась схема компановки
материала книги ...
И, вобще, я считаю что любая книга, по любому ЯП должна начинаться с примера который показывает
как в этом ЯП происходит ввод данных с клавы и вывод их "модернизации" на экран (если, конечно нет
каких то очевидных противопоказаний против этого!) Ведь многие авторы прямо пишут что учиться
программированию, надо программируя, а как начинать это делать не имея выше описанного примера
перед глазами
0
helter
Эксперт по математике/физике
3613 / 2639 / 267
Регистрация: 12.03.2013
Сообщений: 4,839
28.07.2017, 21:13 #13
Цитата Сообщение от Slenon Посмотреть сообщение
И, вобще, я считаю что любая книга, по любому ЯП должна начинаться с примера который показывает
как в этом ЯП происходит ввод данных с клавы и вывод их "модернизации" на экран
Слишком широкое обобщение. Для лиспа такой подход, очевидно, субоптимален. С одной стороны, лисп не так заточен под юникс, как некоторые другие языки. С другой ― его среда даёт возможности, которых нет в других языках. Среда позволяет начинать сразу с «мяса» ― вычисляющий функций, то есть функций, преобразующих данные (например, текст). Ввод-вывод берёт на себя REPL. Вообще, среда делает удобной и поощряет инкрементальную интерактивную разработку.

Ввод-вывод — отдельная область, со своей спецификой, не первая по необходимости. К тому же ФП учит нас отделять ввод-вывод от преобразования данных. (А юникс учит нас отделять вообще всё от всего.) Например, моя функция-комбайн hello в принципе нехороша. В ней смешаны ввод-вывод и вычислительная часть ― создание формулы приветствия. В менее игрушечном примере лучше было бы вынести вычисление в отдельную функцию:
Lisp
1
2
3
4
5
6
7
8
9
10
11
(defun greeting (name)
  (format nil "Привет, ~A!~%" (cond ((null name) "чувак")
                                    ((zerop (length reply)) "никто")
                                    (t reply))))
 
(defun hello ()
  (format *query-io* "~&Как вас зовут?~%")
  (finish-output *query-io*)
  (let ((reply (read-line *query-io*)))
    (write-line (greeting reply) *query-io*))
  (finish-output *query-io*))
Так каждая функция занимается своей логической задачей. Функция greeting, которая делает основную работу, стала проще и, главное, стала чистой, то есть функцией в смысле математики. Её удобнее тестить, чем hello v.1, в том числе в REPLе. Она универсальнее, чем первоначальная функция: её можно использовать из других вычисляющих функций, и по крайней мере она не привязана к одному-единственному способу общения с внешним миром (например, её можно будет использовать для веб-сервера или, скажем, из емакса ― елисп будет дёргать slime и модифицировать текст в буфере).
0
28.07.2017, 21:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.07.2017, 21:13
Привет! Вот еще темы с ответами:

Delphi, Ошибка при вводе - выводе из файла - Delphi
Почему пишет не найдет файл (в проге ассигн,ресет, реврайт стоит на него) создаю его вручную - ошибка пропадает но он ничего в ней не пишет...

Неправильные подсчёты при файловом вводе-выводе - C (СИ)
Исходная программа выглядит так, тут всё выводит и считает правильно: #include <stdio.h> #include <locale.h> #include <math.h> ...

Как вывести информацию о вводе-выводе за последние 25 секунд? - Bash
Доброе всем время суток!В университете задали лабораторную по Linux.А точнее проделать работу по вводу команд в терминал.Все бы ничего,но я...

Работа с циклами при вводе и выводе значений из базы данных - MySQL
Всем доброго времени суток! У меня появилось несолько вопросов по поводу работы с mysql. Попрошу ногами сильно не пинать, так как новичок в...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru