> 1 <

Автор Сообщение

skill_

Members


Статус

5 сообщений

Где: Russia
Род занятий:
Возраст:

#757   2009-12-07 17:56 GMT+3 часа(ов)      
Задача:
Поменять местами черных и белых коней.
----------------------
| ЧК | 0 | ЧК |
----------------------
| 0 | 0 | 0 |
----------------------
| БК | 0 | БК |
----------------------

Пытался реализовать в Lisp in a Box:
(defun transform(plst)
(setq nlst '())
(terpri)
;1
(setq nlst (append nlst (list (car plst))))
;2
(setq nlst (append nlst (list (cadr plst))))
;3
(setq nlst (append nlst (list (caddr plst))))
;8
(setq nlst (append nlst (list (cadr (cdddr (cdddr plst))))))
 
(setq nlst (append nlst '(0)))
;4
(setq nlst (append nlst (list (cadddr plst))))
;7
(setq nlst (append nlst (list (cadddr (cdddr plst)))))
;6
(setq nlst (append nlst (list (caddr (cdddr plst)))))
;5
(setq nlst (append nlst (list (cadr (cdddr plst)))))
 
(print_knight nlst 0 0)
)
 
(defun print_knight(plst n l)
(princ (car plst))
(setq plst_new (cdr plst))
(setq n (+ n 1))
 
(if (> n 2)
(progn
(setq n 0)
(terpri)
(setq l (+ l 1))
)
nil
)
(if (< l 3)
(print_knight plst_new n l )
nil
)
)
 
(defun move (plst)
(setq nlst '())
;6
(setq nlst (append nlst (list (caddr (cdddr plst)))))
;7
(setq nlst (append nlst (list (cadddr (cdddr plst)))))
;8
(setq nlst (append nlst (list (cadr (cdddr (cdddr plst))))))
;1
(setq nlst (append nlst (list (car plst))))
;2
(setq nlst (append nlst (list (cadr plst))))
;3
(setq nlst (append nlst (list (caddr plst))))
;4
(setq nlst (append nlst (list (cadddr plst))))
;5
(setq nlst (append nlst (list (cadr (cdddr plst)))))
 
(return nlst)
)
 
 
(defun Chess(lst)
(terpri)
(transform lst)
(loop
(if (equal lst '(2 0 2 0 1 0 1 0))
(progn
(princ "This is the end step!")
(return)
)
(progn
(setq lst (move lst))
(princ "Second Step is:")
(transform lst)
)
)
)
)
 
 
(defun main()
(clear-screen)
(princ "Game chess")
(terpri)
(chess '(1 0 1 0 2 0 2 0))
(terpri)
(princ "End of the Game")
)
 
(main ())
 

Компилятор ругается на функцию move : "`-- RETURN-FROM block NIL is impossible from here."
Помогите пожалуйста разобраться.

gihar

Moderators


Статус

249 сообщений

Где: --- да вот он я? приехал уже из Катманду
Род занятий: конкретный
Возраст: 4

#759   2009-12-15 01:08 GMT+3 часа(ов)      
В лиспе не рекомендуется применять специальные операторы выхода из
процедуры , это может вызвать нестыковки.
Короче вместо (return nlst) просто поставь nlst
по идее должно работать.
Это было точно последнее редактирование

_lee

Members


Статус

69 сообщений

Где: Russia
Род занятий:
Возраст:

#761   2009-12-15 03:31 GMT+3 часа(ов)      
надо писать
(return-from move ... вместо (return

конечно если это последняя форма в функции то тогда просто результат без (return-from можно

gihar

Moderators


Статус

249 сообщений

Где: --- да вот он я? приехал уже из Катманду
Род занятий: конкретный
Возраст: 4

#762   2009-12-15 10:24 GMT+3 часа(ов)      
Идеальная процедура должна иметь одну точку выхода.

Несколько выходов - недоработка программера.

К тому же , в отличие от остальных языков , конструкции выхода
в Лиспе носят отпечаток искуственности(макросы) , поэтому
требуют более глубокого изучения.
Это было точно последнее редактирование

ufasoft

Members


Статус

19 сообщений

Где: Russia
Род занятий:
Возраст:

#765   2009-12-15 12:37 GMT+3 часа(ов)      
ну RETURN-FROM не макро, а Special Form - его нельзя выразить через другие примитивы.

Выходить изнутри нескольких вложенных циклов лучше именно используя RETURN-FROM. иначе придется специально заводить условие выхода для каждого цикла.

конечно идеальная LISP-прога Должна быть написана без циклов на рекурсиях ;))
> 1 <


Онлайн :

0 пользователь(ей), 22 гость(ей) :