all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Stefan Monnier <monnier@iro.umontreal.ca>
To: emacs-devel@gnu.org
Cc: Yuta Yamada <cokesboy@gmail.com>
Subject: Re: mykie.el
Date: Mon, 06 Jan 2014 19:37:01 -0500	[thread overview]
Message-ID: <jwvbnzoprr9.fsf-monnier+emacs@gnu.org> (raw)
In-Reply-To: <87eh4kg2hv.fsf@flea.lifelogs.com> (Ted Zlatanov's message of "Mon, 06 Jan 2014 17:38:20 -0500")

SM> Is that really much better than [vanilla Emacs lisp]?
> Yes.  The difference is huge for a beginner.

I'm far from convinced.  The beginner will have to learn the
mykie-specific sublanguage.  Maybe it's slightly simpler, but then this
effort won't help him understand other code.

Making it easier to customize Emacs is great, but it's better if it also
gets you some way towards hacking on Emacs so as to become a contributor.

Of course, there are cosmetic issues in the mykie.el syntax that rub me
the wrong way.  Most obvious is the need to quote code.  I already spend
enough time telling people not to quote their lambdas and trying to fix
code that abuses `eval' in all kinds of useless ways.

Starting from

(mykie:global-set-key "C-j"
   :default  '(progn
                (delete-trailing-whitespace)
                (case major-mode
                  (org-mode (org-return-indent))
                  (t        (newline-and-indent))))
   :C-u&eolp '(fill-region (point-at-bol) (point-at-eol))
   :region   'query-replace-regexp)

I'd suggest to first get rid of the quotes and the
`mykie:global-set-key' (so that it can be used with
local-set-key, define-key, you name it):

   (global-set-key "C-j"
      (smkie
       :default  (progn
                  (delete-trailing-whitespace)
                  (case major-mode
                    (org-mode (org-return-indent))
                    (t        (newline-and-indent))))
       :C-u&eolp (fill-region (point-at-bol) (point-at-eol))
       :region   'query-replace-regexp))

Then I suggest we use a parenthesized syntax, and descriptive name, to
be more Lispish:

   (global-set-key "C-j"
      (sm-combined-command
       (:default
        (delete-trailing-whitespace)
        (case major-mode
          (org-mode (org-return-indent))
          (t        (newline-and-indent))))
       (:C-u&eolp (fill-region (point-at-bol) (point-at-eol)))
       (:region   'query-replace-regexp)))

Also, since the user knows about "t is default" from "case", we might as
well get rid of ":default":

   (global-set-key "C-j"
      (sm-combined-command
       (:C-u&eolp (fill-region (point-at-bol) (point-at-eol)))
       (:region   'query-replace-regexp)
       (t
        (delete-trailing-whitespace)
        (case major-mode
          (org-mode (org-return-indent))
          (t        (newline-and-indent))))))

And sm-combined-command is a very simple macro:

  (defconst sm-combined-command-predicates
    '((:region . (use-region-p))
      (:C-u . current-prefix-arg)
      (:C-u&eolp . (and current-prefix-arg (eolp)))
      ...))

  (defmacro sm-combined-command (branches)
    `(lambda ()
       (interactive)
       (cond
        ,@(mapcar (lambda (branch)
                    `(,(or (cdr (assq (car branch)
                                      sm-combined-command-predicates))
                           (car branch))
                      ,@(pcase (cdr branch)
                          (`(',cmd) `((call-interactively ',cmd)))
                          (,cmds cmds))))
                  branches))))
          
-- Stefan



  reply	other threads:[~2014-01-07  0:37 UTC|newest]

Thread overview: 66+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-01-03 20:09 mykie.el Ted Zlatanov
2014-01-03 21:37 ` mykie.el Bozhidar Batsov
2014-01-04  1:08   ` mykie.el Yuta Yamada
2014-01-06 22:47     ` mykie.el, mykie.el Ted Zlatanov
2014-01-06 23:00       ` enable MELPA & Marmalade by defaul [was: mykie.el] Drew Adams
2014-01-06 23:42         ` Óscar Fuentes
2014-01-07  0:29           ` Drew Adams
2014-01-07  1:08             ` Eric Brown
2014-01-07  5:39               ` Drew Adams
2014-01-07  8:33                 ` Nic Ferrier
2014-01-07  8:38                 ` David Kastrup
2014-01-07 14:41                 ` Grim Schjetne
2014-01-07 15:12                   ` Stephen Berman
2014-01-07 17:44                     ` Drew Adams
2014-01-07 20:55                       ` Stephen Berman
2014-01-08 11:52                         ` Tassilo Horn
2014-01-08 13:19                           ` David Kastrup
2014-01-08 14:02                     ` Stefan Monnier
2014-01-08 17:19                       ` enable MELPA & Marmalade by defaul Glenn Morris
2014-01-07 17:44                   ` enable MELPA & Marmalade by defaul [was: mykie.el] Drew Adams
2014-01-08  3:41                     ` Richard Stallman
2014-01-08  4:26                       ` Bob Bobeck
2014-01-08 10:50                       ` Nic Ferrier
2014-01-08 17:54                         ` Achim Gratz
2014-01-09  3:00                           ` Andy Moreton
2014-01-09  6:55                             ` Nic Ferrier
2014-01-09  7:55                           ` Tassilo Horn
2014-01-09 11:24                             ` chad
2014-01-09 18:15                             ` Achim Gratz
2014-01-08  3:23                   ` Stephen J. Turnbull
2014-01-08 10:32                     ` David Kastrup
2014-01-07 16:53             ` Richard Stallman
2014-01-08  3:15               ` Stephen J. Turnbull
2014-01-08  9:27                 ` Richard Stallman
     [not found]           ` <<a62bb795-44d9-44dd-b17a-d5294c21d2b0@default>
     [not found]             ` <<E1W0Zto-0000A5-VX@fencepost.gnu.org>
2014-01-07 17:44               ` Drew Adams
2014-01-07 16:16         ` Ted Zlatanov
2014-01-07 17:44           ` Drew Adams
2014-01-08  3:41             ` Richard Stallman
2014-01-04  2:02   ` mykie.el Yuta Yamada
2014-01-04  4:34 ` mykie.el Stefan Monnier
2014-01-04  8:36   ` mykie.el Leo Liu
2014-01-05  8:10   ` mykie.el Mitchel Humpherys
2014-01-05 10:29     ` mykie.el Leo Liu
2014-01-06 16:09   ` mykie.el Nicolas Richard
2014-01-06 22:38   ` mykie.el Ted Zlatanov
2014-01-07  0:37     ` Stefan Monnier [this message]
2014-01-07 23:21       ` mykie.el Ted Zlatanov
2014-01-08  3:24         ` mykie.el Stefan Monnier
2014-01-08 15:44           ` mykie.el Ted Zlatanov
2014-01-08 16:11             ` mykie.el Stefan Monnier
2014-01-08 16:38               ` mykie.el Ted Zlatanov
2014-01-08 17:24                 ` mykie.el Stefan Monnier
2014-01-09  8:13               ` mykie.el Tassilo Horn
2014-01-09 15:29                 ` mykie.el Stefan Monnier
2014-01-09 18:43                   ` mykie.el Yuta Yamada
2014-01-11 20:23                   ` mykie.el Yuta Yamada
2014-01-12 14:45                     ` mykie.el Stefan Monnier
2014-01-12 18:32                       ` mykie.el Yuta Yamada
2014-01-12 19:46                         ` mykie.el Stefan Monnier
2014-01-12 22:51                           ` mykie.el Yuta Yamada
2014-01-13  3:38                             ` mykie.el Stefan Monnier
2014-01-13  4:59                               ` mykie.el Yuta Yamada
2014-01-13 14:03                                 ` mykie.el Stefan Monnier
2014-01-13 16:09                                   ` mykie.el Yuta Yamada
2014-01-08 21:21             ` mykie.el Yuta Yamada
2014-01-06  5:31 ` mykie.el Yuta Yamada

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=jwvbnzoprr9.fsf-monnier+emacs@gnu.org \
    --to=monnier@iro.umontreal.ca \
    --cc=cokesboy@gmail.com \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.