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
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.