LINUX.ORG.RU

puzzle in mcclim

 


0

1

Вылетает ошибка, указал в теле кода. И как indent этот код в emacs?

;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Package: CLIM-USER; Base: 10 -*-

(in-package :clim-user)

(define-application-frame fifteen-puzzle-1 ()
  ((pieces :initform (make-array `(4 4) :initial-contents `((1 2 3 4)
							    (5 6 7 8)
							    (9 10 11 12)
							    (13 14 15 0)))))
  
(:menu-bar nil)
(:panes
 (display :application
	  :text-style `(:fix :bold :very-large)
	  :display-function `draw-the-display
	  :scroll-bars nil)
 (menu :command-menu))
(:layouts
 (main
  (vertically () display menu))))

;;; this draws the entire display
(defmethod draw-the-display ((application fifteen-puzzle-1) stream
			     &key &allow-other-keys)
(with-slots (pieces) application
(dotimes (y 4)
(dotimes (x 4)
(let ((piece (aref pieces y x)))
(if (zerop piece)
(format stream "
 ")
(format stream "~2D " piece))))
(terpri stream))))
;;; useful macrology - the body will be run with x and y bound to
;;; the coordinates of the empty cell
(defmacro find-empty-piece-and-do ((y x) &body body)
‘(block find-empty-piece
(dotimes `(,y 4)
(dotimes `(,x 4)
(when (zerop `(aref pieces ,y ,x))
  ,@body ;; как бороться сэтим
         ;; READ error during COMPILE-FILE:
         ;; Comma not inside a backquote.
         ;; Line: 41, Column: 3, File-Position: 1092
(return-from find-empty-piece))))))
(define-fifteen-puzzle-1-command (down :menu t) ()
(with-slots (pieces) *application-frame*
(find-empty-piece-and-do (y x)
(if (not (zerop y))
(rotatef (aref pieces y x) (aref pieces (- y 1) x))))))
(define-fifteen-puzzle-1-command (up :menu t) ()
(with-slots (pieces) *application-frame*
(find-empty-piece-and-do (y x)
(if (not (= y 3))
(rotatef (aref pieces y x) (aref pieces (+ y 1) x))))))
(define-fifteen-puzzle-1-command (left :menu t) ()
(with-slots (pieces) *application-frame*
(find-empty-piece-and-do (y x)
(if (not (= x 3))
(rotatef (aref pieces y x) (aref pieces y (+ x 1)))))))
(define-fifteen-puzzle-1-command (right :menu t) ()
(with-slots (pieces) *application-frame*
(find-empty-piece-and-do (y x)
(if (not (zerop x))
(rotatef (aref pieces y x) (aref pieces y (- x 1)))))))
#||
()
(setq fp1 (make-application-frame ’fifteen-puzzle-1
:left 200 :right 400 :top 150 :bottom 350))
(run-frame-top-level fp1)
||#
Ответ на: комментарий от saufesma

Что, вот так вот выделяешь нужный регион в lisp-mode, командуешь M-x indent-for-tab-command и эмакс не форматирует код?

ados ★★★★★
()
Ответ на: комментарий от saufesma

Если оно у тебя «на табе», но не работает, а по команде работает, значит оно у тебя как-то криво прибиндено на таб.

... если вообще прибиндено. describe-key что говорит?

ados ★★★★★
()
Последнее исправление: ados (всего исправлений: 1)
Ответ на: комментарий от ados

Значит, он редактирует в каком-нибудь скратче, где половина ЯП ориентированных хоткеев делают не то, или вообще ничего не делают.

anonymous
()
Ответ на: комментарий от ados

Если оно у тебя «на табе», но не работает, а по команде работает, значит оно у тебя как-то криво прибиндено на таб.

Пока ладно, буду пользоваться вручную. Вот компиляция по очереди

; compiling (IN-PACKAGE :CLIM-USER)
; compiling (DEFINE-APPLICATION-FRAME FIFTEEN-PUZZLE-1 ...)
; compiling (DEFMETHOD DRAW-THE-DISPLAY ...)

STYLE-WARNING:
   Implicitly creating new generic function CLIM-USER::DRAW-THE-DISPLAY.
; compiling (DEFMACRO FIND-EMPTY-PIECE-AND-DO ...)

; file: /tmp/slimetIYnTv
; in: DEFMACRO FIND-EMPTY-PIECE-AND-DO
;     (DEFMACRO CLIM-USER::FIND-EMPTY-PIECE-AND-DO
;               ((CLIM-USER::Y CLIM-USER::X) &BODY CLIM-USER::BODY)
;       `(BLOCK CLIM-USER::FIND-EMPTY-PIECE
;          (DOTIMES (. `(,CLIM-USER::Y 4))
;            (DOTIMES (. `#) (WHEN # ,@CLIM-USER::BODY #)))))
; --> PROGN FUNCTION LET* 
; ==>
;   (LET* ((CLIM-USER::Y (CAR #:REQUIRED-1))
;          (CLIM-USER::X (CAR (CDR #:REQUIRED-1)))
;          (CLIM-USER::BODY (CDR (CDR #:.WHOLE.))))
;     (BLOCK CLIM-USER::FIND-EMPTY-PIECE-AND-DO
;       `(BLOCK CLIM-USER::FIND-EMPTY-PIECE (DOTIMES (. `#) (DOTIMES # #)))))
; 
; caught STYLE-WARNING:
;   The variable Y is defined but never used.
; 
; caught STYLE-WARNING:
;   The variable X is defined but never used.

; file: /tmp/slimetIYnTv
; in: DEFMACRO FIND-EMPTY-PIECE-AND-DO
;     (DEFMACRO CLIM-USER::FIND-EMPTY-PIECE-AND-DO
;               ((CLIM-USER::Y CLIM-USER::X) &BODY CLIM-USER::BODY)
;       `(BLOCK CLIM-USER::FIND-EMPTY-PIECE
;          (DOTIMES (. `(,CLIM-USER::Y 4))
;            (DOTIMES (. `#) (WHEN # ,@CLIM-USER::BODY #)))))
; --> PROGN EVAL-WHEN SB-C::%DEFMACRO LET* 
; ==>
;   (LET* ((CLIM-USER::Y (CAR #:REQUIRED-1))
;          (CLIM-USER::X (CAR (CDR #:REQUIRED-1)))
;          (CLIM-USER::BODY (CDR (CDR #:.WHOLE.))))
;     (BLOCK CLIM-USER::FIND-EMPTY-PIECE-AND-DO
;       `(BLOCK CLIM-USER::FIND-EMPTY-PIECE (DOTIMES (. `#) (DOTIMES # #)))))
; 
; caught STYLE-WARNING:
;   The variable Y is defined but never used.
; 
; caught STYLE-WARNING:
;   The variable X is defined but never used.
; 
; compilation unit finished
;   caught 4 STYLE-WARNING conditions

saufesma ★★
() автор топика
Ответ на: комментарий от ados

... если вообще прибиндено. describe-key что говорит?

Это надо разобраться, как запускать. А тут macroexpand

(PROGN
 (EVAL-WHEN (:COMPILE-TOPLEVEL :LOAD-TOPLEVEL :EXECUTE)
   (SB-C::%DEFMACRO 'FIND-EMPTY-PIECE-AND-DO
                    #'(SB-INT:NAMED-LAMBDA (DEFMACRO FIND-EMPTY-PIECE-AND-DO)
                          (#:.WHOLE. #:.ENVIRONMENT.)
                        (DECLARE (IGNORE #:.ENVIRONMENT.))
                        (LET* ((#:REQUIRED-3835
                                (LET ((#:TEMP-3836 (CAR (CDR #:.WHOLE.))))
                                  (IF (LISTP #:TEMP-3836)
                                      #:TEMP-3836
                здесь косяк --->      (ERROR
                                       'SB-KERNEL::DEFMACRO-BOGUS-SUBLIST-ERROR
                                       :KIND 'DEFMACRO :NAME
                                       'FIND-EMPTY-PIECE-AND-DO :OBJECT
                                       #:TEMP-3836 :LAMBDA-LIST '(Y X))))))
                          (DECLARE (MUFFLE-CONDITIONS CODE-DELETION-NOTE))
                          (LET ((#:ARGS3839 (CDR #:.WHOLE.)))
                            (UNLESS
                                (SB-INT:LIST-OF-LENGTH-AT-LEAST-P #:ARGS3839 1)
                              (SB-KERNEL::ARG-COUNT-ERROR 'DEFMACRO
                                                          'FIND-EMPTY-PIECE-AND-DO
                                                          #:ARGS3839
                                                          '((Y X) &BODY BODY) 1
                                                          NIL)))
                          (LET ((#:ARGS3838 #:REQUIRED-3835))
                            (UNLESS
                                (SB-INT:PROPER-LIST-OF-LENGTH-P #:ARGS3838 2 2)
                              (SB-KERNEL::ARG-COUNT-ERROR 'DEFMACRO
                                                          'FIND-EMPTY-PIECE-AND-DO
                                                          #:ARGS3838 '(Y X) 2
                                                          2)))
                          (LET* ((Y (CAR #:REQUIRED-3835))
                                 (X (CAR (CDR #:REQUIRED-3835)))
                                 (BODY (CDR (CDR #:.WHOLE.))))
                            (BLOCK FIND-EMPTY-PIECE-AND-DO
                              `(BLOCK FIND-EMPTY-PIECE
                                 (DOTIMES (. `(,Y 4))
                                   (DOTIMES (. `(,X 4))
                                     (WHEN (ZEROP `(AREF PIECES ,Y ,X))
                                       ,@BODY
                                       (RETURN-FROM FIND-EMPTY-PIECE)))))))))
                    '((Y X) &BODY BODY) NIL
                    '(MACRO-FUNCTION FIND-EMPTY-PIECE-AND-DO)
                    (SB-C:SOURCE-LOCATION))))
saufesma ★★
() автор топика
Ответ на: комментарий от ados

У тебя лишние кавычки.

Уже нашёл

здесь не должно быть | ^ (when (zerop `(aref pieces ,y ,x))

saufesma ★★
() автор топика
(format stream "
 ")

Лучше так:

(format stream "~% ")
ados ★★★★★
()
Ответ на: комментарий от ados

Вот у меня как

<menu-bar> <lisp> <ind-sexp> runs the command indent-sexp, which is an interactive compiled Lisp function.

It is bound to C-M-q, <menu-bar> <lisp> <ind-sexp>.

(indent-sexp &optional ENDPOS)

Indent each line of the list starting just after point. If optional arg ENDPOS is given, indent each line, stopping when ENDPOS is encountered.

saufesma ★★
() автор топика
Ответ на: комментарий от ados

Я погорячился с вопросами по поводу кода, это игрушка из книги по genera, там дальше функции down, up не определены, и как их определять, с моим сегдняшним уровнем программирования, не имеет смысла.

saufesma ★★
() автор топика
Ответ на: комментарий от saufesma

это игрушка из книги по genera, там дальше функции down, up не определены, и как их определять

так в исходниках McCLIM лежит такой же puzzle в готов виде. С всеми функциями под современный код CLIM-а.

antares0 ★★★★
()
Последнее исправление: antares0 (всего исправлений: 1)
Ответ на: комментарий от saufesma

It is bound to C-M-q, <menu-bar> <lisp> <ind-sexp>

Интересно, а что это у тебя за система такая? Лисповая графическая оболочка или настоящая лисп-машина?

Или это просто эмакс так дико настроен?

ados ★★★★★
()
Последнее исправление: ados (всего исправлений: 1)
Ответ на: комментарий от ados

Или это просто эмакс так дико настроен?

Ты абсолютно прав, емакс прям из ящика, Debian 8. Если можешь подкинь свой .emacs.

Лисповая графическая оболочка.

Я никогда не видел. А если, ты работал/работаешь на лисп-машине, или в лисповой графической оболочке, поделись опытом, сбрось какие - нибудь скриншоты. Очень интересно.

saufesma ★★
() автор топика
Ответ на: комментарий от ados

Вот отсюда

https://youtu.be/FRu8SRWuUko

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

(load-theme 'monokai t)

(setq frame-title-format "emacs")

(menu-bar-mode -1)   ;; switch off menu bar

(tool-bar-mode -1)   ;; switch off tool bar

(scroll-bar-mode -1) ;; switch off scroll bar

(set-default 'cursor-type 'hbar)

(ido-mode)

(column-number-mode)

(show-paren-mode t)

(global-hl-line-mode)  ;; highlight line

(winner-mode t)

(windmove-default-keybindings)

;;   Config package manager
;;(require 'package)

;;(add-to-list 'package-archives
;;	     '("melpa" . "http://melpa.milkbox.net/packages/")
;;	     t)

;;(add-to-list 'package-archives
;;	     '("marmalade". "http://marmalade-repo.org/packages/")
;;	     t)



;;;C-M-f     Move forward over a balanced expression
;;;  C-M-b     Move backward over a balanced expression
;;;  C-M-k     Kill balanced expression forward
;;;  C-M-SPC   put the mark at the end of the sexp.
;;;  C-M-n  Move forward over a parenthetical group 
;;  C-M-p  Move backward over a parenthetical group 
  ;; C-M key binding can also be done by --> ESC Control-key

;;; NO WELCOME PAGE
(setq inhibit-startup-screen t)

;;; Hide initial message
(setq initial-scratch-message nil)

(setq initial-major-mode 'lisp-mode)

;;; load emacs 24's package system. Add MELPA repository.
(when (>= emacs-major-version 24)
  (require 'package)
  (add-to-list
   'package-archives
   '("melpa" . "http://stable.melpa.org/packages/") ; many packages won't show if using stable
   ;;;'("melpa" . "http://melpa.milkbox.net/packages/")
   t)
   )

(package-initialize)

;;Setup load-path, autoloads and your lisp system
(add-to-list 'load-path "/home/igor/.emacs.d/elpa/slime-2.23")
(require 'slime-autoloads)
;;Also setup the slime-fancy contrib
(add-to-list 'slime-contribs 'slime-fancy)

(load (expand-file-name "~/quicklisp/slime-helper.el"))

(setq inferior-lisp-program "/usr/bin/sbcl")

(global-set-key (kbd "M-x") 'smex)

(global-set-key (kbd "C-c C-c M-x") 'execute-extended-command)

;;(ac-config-default)

(nlinum-mode)

(autopair-global-mode)

(global-undo-tree-mode)

(global-set-key (kbd "M-/") 'undo-tree-visualize)

(global-set-key (kbd "C-M-z") 'switch-window)

(global-set-key (kbd "C->") 'ace-jump-mode)



saufesma ★★
() автор топика
Ответ на: комментарий от saufesma

Я никогда не видел. А если, ты работал/работаешь на лисп-машине, или в лисповой графической оболочке, поделись опытом, сбрось какие - нибудь скриншоты. Очень интересно.

Я тоже не видел. Просто не понимаю что ещё может выставить вот такие идентификаторы клавиш:

<lisp> <ind-sexp>

У меня обыкновенное:

TAB (translated from <tab>) runs the command indent-for-tab-command
(found in global-map), which is an interactive compiled Lisp function
in ‘indent.el’.

It is bound to TAB.

(indent-for-tab-command &optional ARG)
ados ★★★★★
()
Последнее исправление: ados (всего исправлений: 1)
Ответ на: комментарий от ados

У меня там не один .emacs а целый проект.

Тогда ладно.

saufesma ★★
() автор топика
Ответ на: комментарий от ados

Просто не понимаю что ещё может выставить вот такие идентификаторы клавиш: <lisp> <ind-sexp>

Подскажи куда залезть, я поковыряю.

saufesma ★★
() автор топика
Ответ на: комментарий от saufesma

Что у тебя за «~/quicklisp/slime-helper.el»?

(nlinum-mode)

(global-set-key (kbd «C->») 'ace-jump-mode)

Я после того как с ace-jump-mode познакомился подумал - нафиг нужна нумерация строк?

(setq initial-major-mode 'lisp-mode)

Вот зачем это? Я тоже думаю что elisp по сравнению cl гагно полное, но зачем выносить удобный текстовый интерфейс к редактору? Есть же https://common-lisp.net/project/slime/doc/html/Scratch-Buffer.html

ados ★★★★★
()
Ответ на: комментарий от ados

Смотря что тебе нужно от твоего эмакса.

Нужно максимум удобства программирования в Lisp, McCLIM

Покажи список установленных пакетов через elpa.

  ace-jump-mode      2.0          installed             a quick cursor location minor mode for emacs
  autopair           0.6.1        installed             Automagically pair braces and quotes like TextMate
  dash               2.16.0       installed             A modern list library for Emacs
  epl                0.9          installed             Emacs Package Library
  flycheck           31           installed             On-the-fly syntax checking
  let-alist          1.0.5        installed             Easily let-bind values of an assoc-list by their names
  macrostep          0.9          installed             interactive macro expander
  monokai-theme      3.5.3        installed             A fruity color theme for Emacs.
  nlinum             1.9          installed             Show line numbers in the margin
  pkg-info           0.6          installed             Information about packages
  seq                2.20         installed             Sequence manipulation functions
  slime              2.23         installed             Superior Lisp Interaction Mode for Emacs
  smex               3.0          installed             M-x interface with Ido-style fuzzy matching.
  switch-window      1.6.2        installed             A *visual* way to switch window
  undo-tree          0.6.5        installed             Treat undo history as a tree
saufesma ★★
() автор топика
Ответ на: комментарий от ados

Что у тебя за «~/quicklisp/slime-helper.el»?

;;;; This file was created automatically by the Quicklisp library
;;;; "quicklisp-slime-helper" from the "quicklisp" dist.

(unless (boundp 'quicklisp-slime-helper-dist)
  (setq quicklisp-slime-helper-dist "quicklisp"))

(setq quicklisp-slime-helper-base
      (if load-file-name
          (file-name-directory load-file-name)
        (expand-file-name "~/quicklisp/")))

(defun quicklisp-slime-helper-file-contents (file)
  (with-temp-buffer
    (insert-file-contents file)
    (buffer-string)))

(defun quicklisp-slime-helper-system-directory (system)
  (let ((location-file (concat quicklisp-slime-helper-base
                               "dists/"
                               quicklisp-slime-helper-dist
                               "/installed/systems/"
                               system
                               ".txt")))
    (when (file-exists-p location-file)
      (let ((relative (quicklisp-slime-helper-file-contents location-file)))
        (file-name-directory (concat quicklisp-slime-helper-base
                                     relative))))))

(defun quicklisp-slime-helper-slime-directory ()
  (quicklisp-slime-helper-system-directory "swank"))

(let* ((quicklisp-slime-directory (quicklisp-slime-helper-slime-directory)))
  (add-to-list 'load-path quicklisp-slime-directory)
  (require 'slime-autoloads)
  (setq slime-backend (expand-file-name "swank-loader.lisp"
                                        quicklisp-slime-directory))
  (setq slime-path quicklisp-slime-directory)
  (slime-setup '(slime-fancy)))

Я после того как с ace-jump-mode познакомился подумал - нафиг нужна нумерация строк?

А я вообще пока не сообразил как работать с ace-jump-mode.

Вот зачем это? Я тоже думаю что elisp по сравнению cl гагно полное, но зачем выносить удобный текстовый интерфейс к редактору?

Предлагаешь выкинуть (setq initial-major-mode 'lisp-mode)?

saufesma ★★
() автор топика
Ответ на: комментарий от ados

Я после того как с ace-jump-mode познакомился подумал - нафиг нужна нумерация строк?

Вот с этим, я ввожу С-с SPC он выдаёт Head Char, я ввожу d, а он высвечивает буквы a, b, c, в видимой части экрана, и всё, для меня это похоже на фигню.

(add-to-list 'load-path "/home/igor/.emacs.d/elpa/ace-jump-mode-2.0/ace-jump-mode.elc")
(autoload
  'ace-jump-mode-pop-mark
  "ace-jump-mode"
  "Ace jump back:-)"
  t)
(eval-after-load "ace-jump-mode"
  '(ace-jump-mode-enable-mark-sync))
(define-key global-map (kbd "C-x SPC") 'ace-jump-mode-pop-mark)
(define-key global-map (kbd "C-c SPC") 'ace-jump-word-mode)
saufesma ★★
() автор топика
Ответ на: комментарий от saufesma

я ввожу d, а он высвечивает буквы a, b, c, в видимой части экрана

Потом нажимаешь подсвеченную букву к которой хочешь переместить курсор. Попробуй ещё C-u С-с SPC и C-u C-u С-с SPC.

Только для этого нужно:

(define-key global-map (kbd "C-c SPC") 'ace-jump-mode)
ados ★★★★★
()
Последнее исправление: ados (всего исправлений: 1)
Ответ на: комментарий от saufesma

Нужно максимум удобства программирования в Lisp, McCLIM

Даже не знаю как помочь с твоей проблемой. Помню как на форуме очень давно один анонимус писал как ещё раньше писал другой анонимус что существует где-то в глубинах сети некий древний файл с кодом на эмакс лиспе. Говорили, что достаточно просто загрузить этот код в эмаксе и скомандовать M-x zdelay-zaebis-mode. Лично я считаю это всё байки старых эмаксеров, но мало ли что.

ados ★★★★★
()
Ответ на: комментарий от ados

Ерунда какая-то, C-c SPC Head Char d, залетает на первую попавшуюся, потом опять C-c SPC Head Char s, он всякие буквы подкрашивает красным, и выдаёт нижеследующее:

[AceJump] One candidate, move to it directly
[AceJump] Internal Error: invalid tree node type
[AceJump] One candidate, move to it directly
[AceJump] Internal Error: invalid tree node type
[AceJump] One candidate, move to it directly
[AceJump] Internal Error: invalid tree node type
[AceJump] One candidate, move to it directly
Auto-saving...
[AceJump] Internal Error: invalid tree node type
Mark set

saufesma ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.