Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Lisp
Перезагрузить страницу Написать программу, которая преобразует цикл FOR
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Bender266 Bender266 вне форума
Member
 
Сообщений: 24
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 06.05.2009
Thumbs down Написать программу, которая преобразует цикл FOR - 22.06.2009, 12:55

Товарищи программисты очень нужна ваша помощь. Нужно Написать программу, которая преобразует цикл FOR произвольной программы на языке Паскаль в соответствие инструкции DО языка ЛИСП(считать что в теле цикла один оператор, выполняющий арифметическое действие, сложение или вычитание)
Заранее спасибо
Ответить с цитированием
  (#2 (permalink)) Старый
Bender266 Bender266 вне форума
Member
 
Сообщений: 24
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 06.05.2009
По умолчанию 06.07.2009, 16:58

Мне предложили в начале fоr разделить на "начальное значение", шаг, "конечно значение". Но я в этом полный ноль. Я надеюсь что здесь найдутся люди которые смогут мне еще чем-нибудь помочь. Заранее спасибо всем кто откликнится на мою помощь
Ответить с цитированием
  (#3 (permalink)) Старый
IL_Agent IL_Agent вне форума
Member
 
Аватар для IL_Agent
 
Сообщений: 2,015
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.07.2005
По умолчанию 07.07.2009, 11:39

Код:
x:=0;
for  i:= 1 to 5 do x:=x+i;
Код:
(progn 
   (setq x 0)
   (do ((i 1 (+ i 1))) ((= i 5)) 
     (setq x (+ x i))
   )
)
Возможны ошибки.
Ответить с цитированием
  (#4 (permalink)) Старый
"программист" "программист" вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.07.2009
По умолчанию 10.07.2009, 19:39

Это же моя задача.

Много уважаемые мною программисты этого великого языка LISP, не могли бы вы быть так добры и написать мне программу чтобы ее мог понять даже я? Просто мне это кусочек не говорит ни о чем((( А сдавать ее надо, да и сроки уже поджимают, через 1,5 недели уже экзамен, а я даже до него еще не допущен. Перерыл уже целую гору книг и не нашел ничего чтобы мне могло помочь. Этот форум моя последняя надежда. И поэтому я Вас просто умоляю, напишите мне пожалуйста как она решается поточнее, что бы я смог ее понять.

За ранее огромное Вам спасибо, ото всех кому вы уже помогли и кому еще поможете. И большое спасибо от меня лично.
Ответить с цитированием
  (#5 (permalink)) Старый
IL_Agent IL_Agent вне форума
Member
 
Аватар для IL_Agent
 
Сообщений: 2,015
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.07.2005
По умолчанию 13.07.2009, 10:16

Что именно не понятно ?
Цитата:
не могли бы вы быть так добры и написать мне программу чтобы ее мог понять даже я?
Кто знает, есть вероятность, что это в принципе не решаемая задача .
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
"программист" "программист" вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.07.2009
По умолчанию 13.07.2009, 17:09

Нет это очень плохая вероятность
Ответить с цитированием
  (#7 (permalink)) Старый
IL_Agent IL_Agent вне форума
Member
 
Аватар для IL_Agent
 
Сообщений: 2,015
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.07.2005
По умолчанию 14.07.2009, 12:28

Цитата:
Нет это очень плохая вероятность
Однако, если ты перерыл гору книг и не можешь понять 3 строчки кода, она достаточно велика
Ответить с цитированием
  (#8 (permalink)) Старый
VH VH вне форума
Member
 
Сообщений: 781
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 10 сообщениях
Регистрация: 29.06.2006
По умолчанию 14.07.2009, 13:59

Код:
(defun F (pascal)
  (apply
  '(lambda (name counter ass start dir finish body sym ass oper1 op oper2)
    (list 'do
     (list
      (list
       counter
       start
       (list
        (cond ((eq dir 'to) '1+) ((eq dir 'downto) '1-))
        counter)))
     (list
      (list
       (cond ((eq dir 'to) '>) ((eq dir 'downto) '<))
       counter
       finish)
      sym)
     (list
     'setq
      sym
      (list op oper1 oper2))))
   pascal))
Вызов функции:
(F '(for i = 1 to 10 do k := k + i))
Аргумент вызова функции F - выражение (в виде списка) на языке Pascal, представляющее конструкцию FOR (за исключением замыкающей «точки с запятой», так как в LISPе данный знак используется как обозначение начала комментария)
(DO ((I 1 (1+ I))) ((> I 10) K) (SETQ K (+ K I)))
Вызов функции F возвращает предложение DO, которое можно вычислить:
(setq k 0)
(eval (F '(for i = 1 to 10 do k := k + i)))
возвращает 55
Ответить с цитированием
  (#9 (permalink)) Старый
&quot;программист&quot; &quot;программист&quot; вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.07.2009
По умолчанию 14.07.2009, 22:53

Просто как я понимаю. Это просто не весь код программы, потому что такой маленький код, с таким условием задания быть не может
Ответить с цитированием
  (#10 (permalink)) Старый
&quot;программист&quot; &quot;программист&quot; вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.07.2009
По умолчанию 14.07.2009, 23:14

VH, огромнейшее тебе спасибо. У меня просто нету слов
Ответить с цитированием
  (#11 (permalink)) Старый
&quot;программист&quot; &quot;программист&quot; вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.07.2009
По умолчанию 14.07.2009, 23:24

Осталось дело за малым.... попытаться ее все-таки запустить что бы сам LISP не выдовал критическую ошибку.... и потом еще понять как она работает....
Ответить с цитированием
  (#12 (permalink)) Старый
VH VH вне форума
Member
 
Сообщений: 781
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 10 сообщениях
Регистрация: 29.06.2006
По умолчанию 14.07.2009, 23:55

Протокол работы:
XLISP-PLUS version 3.04
Portions Copyright © 1988, by David Betz.
Modified by Thomas Almy and others.
> (defun F (pascal)
(apply
'(lambda (name counter ass start dir finish body sym ass oper1 op oper2)
(list 'do
(list
(list
counter
start
(list
(cond ((eq dir 'to) '1+) ((eq dir 'downto) '1-))
counter)))
(list
(list
(cond ((eq dir 'to) '>) ((eq dir 'downto) '<))
counter
finish)
sym)
(list
'setq
sym
(list op oper1 oper2))))
pascal))
F
> (F '(for i = 1 to 10 do k := k + i))
(DO ((I 1 (1+ I))) ((> I 10) K) (SETQ K (+ K I)))
> (eval (F '(for i = 1 to 10 do k := k + i)))
error: unbound variable - K
> (setq k 0)
0
> (eval (F '(for i = 1 to 10 do k := k + i)))
55
>
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
IL_Agent IL_Agent вне форума
Member
 
Аватар для IL_Agent
 
Сообщений: 2,015
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.07.2005
По умолчанию 15.07.2009, 00:08

Цитата:
Вызов функции:
(F '(for i = 1 to 10 do k := k + i))
Аргумент вызова функции F - выражение (в виде списка) на языке Pascal, представляющее конструкцию FOR (за исключением замыкающей «точки с запятой», так как в LISPе данный знак используется как обозначение начала комментария)
(DO ((I 1 (1+ I))) ((> I 10) K) (SETQ K (+ K I)))
Вызов функции F возвращает предложение DO, которое можно вычислить:
(setq k 0)
(eval (F '(for i = 1 to 10 do k := k + i)))
возвращает 55
А как бы это с макросами выглядело ?
Ответить с цитированием
  (#14 (permalink)) Старый
Alexey Dejneka Alexey Dejneka вне форума
Member
 
Сообщений: 451
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.11.2004
По умолчанию 15.07.2009, 07:48

Цитата:
А как бы это с макросами выглядело ?
Код:
(defmacro pascal (&rest exp)
  (f exp))

(let ((k 0))
  (pascal for i = 1 to 10 do k := k + i)
  (print k))
Ответить с цитированием
  (#15 (permalink)) Старый
VH VH вне форума
Member
 
Сообщений: 781
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 10 сообщениях
Регистрация: 29.06.2006
По умолчанию 15.07.2009, 09:51

Функция устроена достаточно просто.
Элементы Pascal-выражения «распределяются» по параметрам лямбда-выражения, в данном примере
имя_конструкции (name) -> for
счетчик (counter) -> i
присваивание (ass) -> :=
начальное_значение (start) -> 1
направление (dir) -> to
конечное_значение (finish) -> 10
тело (body) -> do
символ (sym) -> k
присваивание (ass) -> :=
операнд1 (oper1) -> k
операция (op) -> +
операнд2 (oper2) -> i
Конструируется LISP-выражение DO с участием значений <некоторых из> данных параметров, при этом значение параметра dir используется для выбора «подходящих» функций 1+/1- и </>.
Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как написать программу которая строит графики bajge Delphi 5 18.06.2011 01:48
Написать программу которая упорядочивает строки Ксюня краса .NET 3 06.06.2011 13:23
Нужно сделать программу, которая выполняет цикл в одной кнопке Zveriko .NET 6 03.05.2011 17:05
Как написать программу которая бы переумножала два ядра Pokornaya Вопросы начинающих программистов 1 10.01.2010 22:49
Написать программу которая ищет отсутствующие строки KamalovRadik С/С++ 2 16.12.2009 18:25
Написать программу, которая преобразует условные операторы IF toxa161 Lisp 0 21.07.2009 18:30
Написать программу, которая преобразует циклы FOR Bender266 Lisp 1 09.05.2009 22:54
Как написать программу которая анализирует строку imported_JET_ C++ Builder 4 18.09.2006 17:00
Как написать программу которая формировала штрих код EAN 13 sharovia C++ Builder 3 19.04.2006 09:19
Нужна функция, которая преобразует символьное представление числа в само число Rune Visual C++ 3 13.03.2006 19:51
Как написать программу которая бы копировала все файлы Anonymous Perl 1 20.01.2004 18:17
Написать программу которая закрывает любую программу из автозагрузки без перезагрузк Anonymous C++ Builder 1 07.10.2003 11:24



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов