Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
-207 / 93 / 14
Регистрация: 26.06.2013
Сообщений: 4,604
1

Условный выход из функции: PROG RETURN

07.05.2020, 20:40. Показов 2287. Ответов 63
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пока не понимаю, что делает prog? Знаю про prog1, prog2, progn.

Здесь http://www.mari-el.ru/mmlab/ho... index.html написано
Если локальных переменных нет записывается (prog ()...)
это не понимаю.

В коде написано (prog (x y); локальные переменные
Пока насчет локальных переменных с помощью prog не понял. Читал про let.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.05.2020, 20:40
Ответы с готовыми решениями:

Выход из рекурсивного метода не осуществляется по Return
Почему-то после return опять рекурсию повторяет, мб я неправильно её написал ? private string...

Выход из блока using через return. Произойдет ли Dispose()?
Такой код: static class StringExtension { public static string GZipCompress(this...

Запишите с использованием предложения PROG функцию (аналог встроенной функции LENGTH )
Запишите с помощью предложения PROG функцию (аналог встроенной функции LENGTH ), которая возвращает...

Что это isOk(int s),setAge(int g){if(isOk(g){age=g;return true;}else{.;return false;}}.getName(){return name;}?
package com.company; import java.io.Serializable; public class person implements Serializable {...

63
-207 / 93 / 14
Регистрация: 26.06.2013
Сообщений: 4,604
08.05.2020, 06:23  [ТС] 2
Ездаков Функциональное и логическое программирование 2009
Страница 14
Миниатюры
Условный выход из функции: PROG RETURN  
0
-207 / 93 / 14
Регистрация: 26.06.2013
Сообщений: 4,604
08.05.2020, 06:50  [ТС] 3
Из "Ознакомительная работа в среде MuLisp"
5. Передача управления.
На Лиспе можно писать программы и в обычном операторном стиле с использованием передачи управления. Однако во многих системах не рекомендуется использовать эти предложения, так как их можно заменить другими предложениями (например DO) и, как правило, в более понятной форме. Но мы рассмотрим предложения передачи управления, хотя использовать их не следует.
Код
(PROG (m1 m2 ... mn)
             оператор1
             оператор2
              ...
             операторm)
Перечисленные в начале формы переменные mi являются локальными статическими переменными формы, которые можно использовать для хранения промежуточных результатов. Если переменных нет, то на месте списка переменных нужно ставить NIL. Если какая-нибудь форма операторi является символом или целым числом, то это метка перехода. На такую метку можно передать управление оператором GO:
(GO метка)
GO не вычисляет значение своего «аргумента».
Кроме этого, в PROG-механизм входит оператор окончания вычисления и возврата значения:
(RETURN результат)
Операторы предложения PROG вычисляются слева направо (сверху вниз), пропуская метки перехода. Оператор RETURN прекращает выполнение предложения PROG; в качестве значения всего предложения возвращается значение аргумента оператора PROG. Если во время вычисления оператор RETURN не встретился, то значением PROG после вычисления его последнего оператора станет NIL .
После вычисления значения формы связи программных переменных исчезают.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
08.05.2020, 07:07 4
И что же конкретно непонятно? Все верно написано. Вот мое изложение
1
-207 / 93 / 14
Регистрация: 26.06.2013
Сообщений: 4,604
08.05.2020, 07:41  [ТС] 5
Мир лиспа, том 2
6. Не используй предложение PROG, если можно
использовать более наглядную форму, например
DO.
7. Не используй переменные DO в качестве
константы, а задавай их внешней формой LET.
Добавлено через 31 минуту
Цитата Сообщение от Catstail Посмотреть сообщение
И что же конкретно непонятно?
С первого раза на днях не осилил. Возможно при повторном прочтении лучше пойму.

Ещё описание Prog есть в следующей литературе (в ряде случаев не совсем понятно написано).

Лавров С.С., Силагадзе Г.С. - Автоматическая обработка данных. Язык ЛИСП и его реализация (1978)
Страницы 31, 90

Мир лиспа, том 1.
Страница 139

Н. Ю. Салмина - Функциональное программирование и интеллектуальные системы-ТУСУР Томск (2016)
Страница 57

Семенова Е.Т. - Язык программирования LISP 1.5
Страницы 52, 53

Фролов Г.Д., Кузнецов Э.И. - Элементы информатики (1989)
Страница 257.

Пол Грэм - ANSI Common Lisp-Символ-Плюс (2012)
Страница 327

Городняя Л.В., Березин Н.А - Введение в программирование на Лиспе
Страница 116

Городняя Л.В. - Введение в программирование на языке LISP
Страница 75

Маурер Введение в программирование на языке ЛИСП (1976)

Е.И. Большакова, Н.В. Груздева Основы программирования на языке Лисп 2010
Страница 103
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
08.05.2020, 08:24 6
В отошении замечания Ездакова, о том, "что с введением PROG Лисп пошел под откос" - думаю, что он совершенно не прав! Никто никогда не заставлял лисперов использовать PROG. Не может дополнительная возможность навредить. Не нужна - не пользуйся!
0
-207 / 93 / 14
Регистрация: 26.06.2013
Сообщений: 4,604
08.05.2020, 13:29  [ТС] 7
Подскажите, есть ли ошибка в скобках? Как правильно вызывать?
Е.И. Большакова, Н.В. Груздева Основы программирования на языке Лисп 2010
Страница 103.
В качестве примера использования prog приведём ещё одно
определение функции Reverse:
Lisp
1
2
3
4
5
6
7
(defun ReverseProg (L)
    prog (Res)
        C   ; метка перехода
        (cond (( null L) (return Res))) ; выход из блока
        (setq Res (cons (car L) Res))
        (setq L (cdr L))
        (go C) )) ; переход по метке
Добавлено через 33 минуты
А этот код нужно переделывать, чтобы он запускался в современном интерпретаторе или должно работать так?

Маурер Введение в программирование на языке ЛИСП (1976)
Страница 59

В качестве примера всех этих понятий мы рассмотрим нерекур-­
сивную программу, которая может быть записана на ФОРТРАНе
или АЛГОЛе для нахождения факториала целого числа:
Здесь идут примеры этого кода на других языках.
Lisp
1
2
3
4
5
6
7
define (((fact (lambda (N) (prog (I J)
        (setq I N) (setq J 1)
K (cond ((zerop I) (go L)
        (setq J (times J I))
        (setq I (difference I 1))
        (go K)
L (return J)) )))))
Опять обратим внимание на пять правых скобок, которые вы-­
делены в конце программы. Первая из них связана с левой скоб-­
кой перед PROG. В общем случае после последнего оператора,
записанного в PROG, используются три правые скобки, если в том
же DEFINE-выражении определяются еще какие-либо функции; и
пять правых скобок в противном случае.
0
-207 / 93 / 14
Регистрация: 26.06.2013
Сообщений: 4,604
08.05.2020, 13:32  [ТС] 8
Маурер Введение в программирование на языке ЛИСП (1976)
Страница 58.
Миниатюры
Условный выход из функции: PROG RETURN  
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
08.05.2020, 13:56 9
Цитата Сообщение от supmener Посмотреть сообщение
Подскажите, есть ли ошибка в скобках? Как правильно вызывать?
- есть.

Lisp
1
2
3
4
5
6
7
8
9
10
11
(defun ReverseProg (L)
    (prog (Res)
     C  (cond ((null L) (return Res))) 
        (setq Res (cons (car L) Res))
        (setq L (cdr L))
        (go C) )) 
 
==> REVERSEPROG
 
(reverseprog '(1 2 3 4))
==> (4 3 2 1)
Добавлено через 1 минуту
supmener, замечание Mayрера по Cond неактуально. И его книга сильно устарела. Есть же книга П.Грэма...
1
-207 / 93 / 14
Регистрация: 26.06.2013
Сообщений: 4,604
08.05.2020, 14:43  [ТС] 10
Почему не актуально?
Цитата Сообщение от Catstail Посмотреть сообщение
Есть же книга П.Грэма...
Там по этому поводу очень мало написано, несколько строк.
Цитата Сообщение от supmener Посмотреть сообщение
А этот код нужно переделывать, чтобы он запускался в современном интерпретаторе или должно работать так?
TIMES - это вместо знака умножения
DIFFERENCE - это вместо знака вычитания (- 8 2) => 6
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
08.05.2020, 15:36 11
Цитата Сообщение от supmener Посмотреть сообщение
Там по этому поводу очень мало написано, несколько строк.
- а оно больше и не стоит. Все элементарно.
0
-207 / 93 / 14
Регистрация: 26.06.2013
Сообщений: 4,604
08.05.2020, 17:36  [ТС] 12
Цитата Сообщение от Catstail Посмотреть сообщение
Подскажите, есть ли ошибка в скобках? Как правильно вызывать?
- есть.
Lisp
1
2
3
4
5
6
7
(defun ReverseProg (L)
    prog (Res)
        C   ; метка перехода
        (cond (( null L) (return Res))) ; выход из блока
        (setq Res (cons (car L) Res))
        (setq L (cdr L))
        (go C) )) ; переход по метке
Миниатюры
Условный выход из функции: PROG RETURN  
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
08.05.2020, 18:37 13
supmener, ты же опять сунул неверный код! Посмотри внимательно: у меня слева от prog скобка есть, а у тебя - нет...
1
-207 / 93 / 14
Регистрация: 26.06.2013
Сообщений: 4,604
09.05.2020, 12:28  [ТС] 14
А если писать построчно, то правильно получается? А какую команду ввести дальше, чтобы разом всё не решилось и понятьненько чтобы получилось?
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
(setf res '(1 2 3 4))
 
==> (1 2 3 4)
;; Создана глобальная переменная res
(setf L res)
 
==> (1 2 3 4)
;; Создана глобальная переменная L
(cons (car L) Res)
 
==> (1 1 2 3 4)
(setf L (cdr L))
 
==> (2 3 4)
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
09.05.2020, 13:13 15
supmener, да, так при необходимости можно... Если нужно, чтобы эти формы вычислились последовательно, их можно заключить в progn.
0
-207 / 93 / 14
Регистрация: 26.06.2013
Сообщений: 4,604
25.05.2020, 20:50  [ТС] 16
Почему то не работает.
Из книги автора Н. Ю. Салмина - Функциональное программирование и интеллектуальные системы-ТУСУР Томск (2016)
(Страница 58)
Рассмотрим реализацию функции REVERSE без рекурсии, но с использованием PROG-выражения.

Lisp
1
2
3
4
(defun reverse (x)
   (prog (y)
     L (cond ((atom x) (return y))
           (t (setq y (cons (car x) y)) (setq x (cdr x)) (go L)))))
0
Эксперт функциональных языков программированияЭксперт Java
4486 / 2721 / 485
Регистрация: 28.04.2012
Сообщений: 8,590
25.05.2020, 21:10 17
Цитата Сообщение от supmener Посмотреть сообщение
Почему то не работает.
А ты почитай, что тебе в ошибке пишут.
0
-207 / 93 / 14
Регистрация: 26.06.2013
Сообщений: 4,604
25.05.2020, 21:59  [ТС] 18
Код
WARNING: redefining COMMON-LISP:REVERSE in DEFUN

debugger invoked on a SYMBOL-PACKAGE-LOCKED-ERROR in thread
#<THREAD "main thread" RUNNING {23170329}>:
  Lock on package COMMON-LISP violated when setting fdefinition of REVERSE
  while in package COMMON-LISP-USER.
See also:
  The SBCL Manual, Node "Package Locks"
  The ANSI Standard, Section 11.1.2.1.2

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [CONTINUE      ] Ignore the package lock.
  1: [IGNORE-ALL    ] Ignore all package locks in the context of this operation.

  2: [UNLOCK-PACKAGE] Unlock the package.
  3: [ABORT         ] Exit debugger, returning to top level.

(PACKAGE-LOCK-VIOLATION #<PACKAGE "COMMON-LISP"> :SYMBOL REVERSE :FORMAT-CONTROL "setting fdefinition of ~A" :FORMAT-ARGUMENTS (REVERSE))
0]
Код
ВНИМАНИЕ: переопределение COMMON-LISP: ОБРАТНО в DEFUN

отладчик вызван на SYMBOL-PACKAGE-LOCKED-ERROR в потоке
# <THREAD "main thread" RUNNING {23170329}>:
   Блокировка пакета COMMON-LISP нарушена при установке определения REVERSE
   пока в пакете COMMON-LISP-USER.
Смотрите также:
   Руководство SBCL, узел "Пакетные замки"
   Стандарт ANSI, раздел 11.1.2.1.2

Введите HELP для справки отладчика или (SB-EXT: EXIT) для выхода из SBCL.

перезапуск (вызывается по номеру или, возможно, сокращенному названию):
   0: [ПРОДОЛЖЕНИЕ] Игнорировать блокировку пакета.
   1: [IGNORE-ALL] Игнорировать все блокировки пакетов в контексте этой операции.

   2: [UNLOCK-PACKAGE] Разблокировать пакет.
   3: [ABORT] Выход из отладчика, возврат на верхний уровень.

(PACKAGE-LOCK-VIOLATION # <PACKAGE "COMMON-LISP">: СИМВОЛ ОБРАТНЫЙ: ФОРМАТ-КОНТРОЛЬ ", устанавливающий определение ~ A": ФОРМАТ-АРГУМЕНТЫ (ОБРАТНЫЙ))
0]
0
-207 / 93 / 14
Регистрация: 26.06.2013
Сообщений: 4,604
26.05.2020, 16:27  [ТС] 19
Почему то просит ввести число после того, как оно введено.
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
(defun s-d ()
(prog (x y); локальные переменные
(print '(type number))
(setq x (read))
(and (not (numberp x)) (return nil))
(print '(type number))
(setq y (read))
(and (not (numberp y)) (return nil))
(print (+ x y))
(print (- x y))))
S-D
*
(s-d)
 
4
(TYPE NUMBER)
3
(TYPE NUMBER)
7
1
NIL
*
0
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
26.05.2020, 16:33 20
Я буквально вчера-позавчера писал вам про организацию интерактивного ввода-вывода. В частности, там есть ответ на ваш вопрос. Перепишете как положено - будет работать как положено.
0
26.05.2020, 16:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.05.2020, 16:33
Помогаю со студенческими работами здесь

Условный экстремум функции
Найти условный экстремум функции при помощи функции Лагранжа. z=2x2+3y2, при х-y=3

Условный оператор в функции?
В этом примере: def prim(a,b): if a &gt; b: c = a + b else: c = a - b return (c)

Условный оператор. Функции
Даны три вершины треугольника. Узнать, в каких четвертях (на координатной сетке) он находится....

Условный Экстремум функции
что делать если второй дифференциал от функции Лагранжа равен нулю и дифференциал от уравнения...

Условный оператор, табулирование функции.
составить прогу в паскале

Исследование функции на условный экстремум
Исследовать функцию z=xy на условный экстремум при условии {x}^{2}+{y}^{2}=1.


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru