unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
* some more material on the Lisp data/code psychedelia
@ 2014-01-04 19:37 Emanuel Berg
  2014-01-04 20:13 ` Thien-Thi Nguyen
       [not found] ` <mailman.11016.1388866201.10748.help-gnu-emacs@gnu.org>
  0 siblings, 2 replies; 5+ messages in thread
From: Emanuel Berg @ 2014-01-04 19:37 UTC (permalink / raw)
  To: help-gnu-emacs

The whole discussion on types and the Lisp data/code
blend was the source of some confusion. But perhaps
that's nothing to be ashamed of.

I thought it would be clearer if I could turn it into
actual code. So if you don't mind, please comment on
this.

(defun increment-last (l)
  (interactive)
  (if (not l) '()
    (let ((hd (car l))
          (tl (cdr l)) )
      (if (not tl)
          (list (+ 1 hd))
        (cons hd (increment-last tl) )))))

;; test
(increment-last '())       ; => '()
(increment-last '(1))      ; => '(2)
(increment-last '(1 2 3))  ; => '(1 2 4)

(defun do-change-me ()
  (interactive)
  (fset 'do-change-me
        (increment-last (symbol-function 'do-change-me)) )
  1)

(do-change-me) ; hit `C-x e' repeatedly here

-- 
underground experts united:
http://user.it.uu.se/~embe8573


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: some more material on the Lisp data/code psychedelia
  2014-01-04 19:37 some more material on the Lisp data/code psychedelia Emanuel Berg
@ 2014-01-04 20:13 ` Thien-Thi Nguyen
       [not found] ` <mailman.11016.1388866201.10748.help-gnu-emacs@gnu.org>
  1 sibling, 0 replies; 5+ messages in thread
From: Thien-Thi Nguyen @ 2014-01-04 20:13 UTC (permalink / raw)
  To: help-gnu-emacs

[-- Attachment #1: Type: text/plain, Size: 840 bytes --]

() Emanuel Berg <embe8573@student.uu.se>
() Sat, 04 Jan 2014 20:37:15 +0100

   (defun increment-last (l)
     (interactive)
     (if (not l) '()
       (let ((hd (car l))
             (tl (cdr l)) )
         (if (not tl)
             (list (+ 1 hd))
           (cons hd (increment-last tl) )))))

You can also use ‘last’ and ‘setcar’ (via ‘incf’) for this:

 (defun increment-last (ls) 
   (when ls 
     (incf (car (last ls)))
     ls))

Non-recursive means less stack required for long forms.  Destructive
style is sketchy but the func is already squarely in DWR territory...

-- 
Thien-Thi Nguyen
   GPG key: 4C807502
   (if you're human and you know it)
      read my lisp: (responsep (questions 'technical)
                               (not (via 'mailing-list)))
                     => nil

[-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: some more material on the Lisp data/code psychedelia
       [not found] ` <mailman.11016.1388866201.10748.help-gnu-emacs@gnu.org>
@ 2014-01-04 20:24   ` Emanuel Berg
  2014-01-04 23:40     ` Emanuel Berg
  0 siblings, 1 reply; 5+ messages in thread
From: Emanuel Berg @ 2014-01-04 20:24 UTC (permalink / raw)
  To: help-gnu-emacs

Thien-Thi Nguyen <ttn@gnu.org> writes:

> You can also use ‘last’ and ‘setcar’ (via ‘incf’) for
> this:
>
>  (defun increment-last (ls) (when ls (incf (car (last
> ls))) ls))
>
> Non-recursive means less stack required for long
> forms.  Destructive style is sketchy but the func is
> already squarely in DWR territory...

That's interesting:

(setq *ls* '(1 2 3))

(defun inc-last (ls)
  (when ls
    (incf (car (last ls)))
    ls) )

(inc-last *ls*)
*ls* ; => '(1 2 4) after the above line

I wonder how the "destructiveness" can be used with
respect to the rest of the demo...?

DWR = Design with Reuse?

-- 
underground experts united:
http://user.it.uu.se/~embe8573


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: some more material on the Lisp data/code psychedelia
  2014-01-04 20:24   ` Emanuel Berg
@ 2014-01-04 23:40     ` Emanuel Berg
  2014-01-17  1:29       ` Emanuel Berg
  0 siblings, 1 reply; 5+ messages in thread
From: Emanuel Berg @ 2014-01-04 23:40 UTC (permalink / raw)
  To: help-gnu-emacs

Emanuel Berg <embe8573@student.uu.se> writes:

>> You can also use ‘last’ and ‘setcar’ (via ‘incf’)
>> for this: (defun increment-last (ls) (when ls (incf
>> (car (last ls))) ls)) Non-recursive means less stack
>> required for long forms.  Destructive style is
>> sketchy but the func is already squarely in DWR
>> territory...
>
> That's interesting:
>
> (setq *ls* '(1 2 3))
>
> (defun inc-last (ls) (when ls (incf (car (last ls)))
> ls) )
>
> (inc-last *ls*) *ls* ; => '(1 2 4) after the above line
>
> I wonder how the "destructiveness" can be used with
> respect to the rest of the demo...?

How about:

(defun change-me ()
  (incf (car (last (symbol-function 'change-me))))
  1)

(change-me) ; hit `C-x e' repeatedly here

Ironic thing is, first version, while not as good,
actually showed the duality in a cool way. The above
version just looks stiff, its purpose unclear.

-- 
underground experts united:
http://user.it.uu.se/~embe8573


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: some more material on the Lisp data/code psychedelia
  2014-01-04 23:40     ` Emanuel Berg
@ 2014-01-17  1:29       ` Emanuel Berg
  0 siblings, 0 replies; 5+ messages in thread
From: Emanuel Berg @ 2014-01-17  1:29 UTC (permalink / raw)
  To: help-gnu-emacs

;; Another classic demo for you all to vibe with.
;;
;; Sort of OO data/method encapsulation, and sort of
;; XML unrestricted markup, to do run-time data/type
;; consistency.
;;
;; (HELP! I'm a Lisp addict!)

;; version one
(setq *typed-symbol* '(0 integerp))

;; version two (combination of types)
(setq *typed-symbol* '(0.0 (lambda (val)
                             (or (floatp val)
                                 (integerp val) ))))
(fset
 '*typed-symbol*
 '(lambda (&optional new-data)
    (progn
      (if new-data
          (if (eval `(,(cadr *typed-symbol*) new-data))
              (setcar *typed-symbol* new-data)
            (error "Wrong type") ))
      (car *typed-symbol*) )))

(*typed-symbol*)     ; 0 (or 0.0), no change
(*typed-symbol* 4)   ; 4, cool
(*typed-symbol* 4.0) ; doesn't work for version one
(*typed-symbol* "disrespecting the type, man") ; error
(*typed-symbol*)     ; still 4 (or 4.0)

;; or, if desire to use a (half) normal variable:

(setq *integer-symbol* 1)

(fset
 '*integer-symbol*
 '(lambda (new-data)
    (if (integerp new-data)
        (setq *integer-symbol* new-data)
      (error "Wrong type: Integers only") )))

*integer-symbol*       ; 1
(*integer-symbol* 2)   ; 2
*integer-symbol*       ; 2
(*integer-symbol* 2.0) ; no floats
(*integer-symbol* "no strings") ; error

-- 
underground experts united:
http://user.it.uu.se/~embe8573


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2014-01-17  1:29 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-01-04 19:37 some more material on the Lisp data/code psychedelia Emanuel Berg
2014-01-04 20:13 ` Thien-Thi Nguyen
     [not found] ` <mailman.11016.1388866201.10748.help-gnu-emacs@gnu.org>
2014-01-04 20:24   ` Emanuel Berg
2014-01-04 23:40     ` Emanuel Berg
2014-01-17  1:29       ` Emanuel Berg

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).