TweetFollow Us on Twitter

3-D Rotation
Volume Number:1
Issue Number:13
Column Tag:Lisp Listener

3-D Rotations

By Andy Cohen, Engineer, MacTutor Contributing Editor

Mapping Functions

Applicative operators are functions which use other functions as inputs. One of the most typical across Lisp dialects is MAPCAR. MAPCAR can perform an operation on each member of one given list, sequentially. It is therefore another form of iteration. MAPCAR operates in the same manner APPLY works in the following:

(apply + '(2 3 4 5))
14

MAPCAR, however, provides the capability to perform a given function for each atom within a given list. It can be seen as an "APPLY_TO_ALL". For example, suppose one wanted the square root of each value in a list of five values and create a corresponding list of these square roots. One way to do this is to remove the values from the list with nested CARS. Then, after applying the SQRT function to each value, a new list would need to be produced with a CONS. This method might get needlessly tedious. MAPCAR makes it possible to get this list in a much more convenient fashion.

(MAPCAR (lambda (x) (SQRT x)) '(2 3 4 5))
(1.41421356 1.73205080 2. 2.23606797)

LAMBDA is a special word that tells Lisp that what is following is to be treated as a function similar to DEFUN. LAMBDA acts like a one time only DEFUN. The (x) is the passed value and the list with the square root primitive is the expression to be carried out. MAPCAR takes the first value from the list (2 3 4 5) sequentially (that is why it is MAPCAR) and places it into x. It then puts each computed value into a list. How about another sample:

(setq x '(2 5)) (setq y '(5 7))
(mapcar (lambda (n) (* .5 n)) (append x y)))
(2  5 )
(5  7 )
(1.  2.5  2.5  3.5 )

APPEND puts the values represented by the symbols x and y into a list. MAPCAR takes one atom at a time from the new list and multiplies it by .5.

MAPLIST is another form of mapping or sequencing function. However, instead of sequencing through a list one atom at a time MAPLIST performs a function on two entire lists. For example:

(MAPLIST APPEND '(A B C) '(D E F))
((A B C D E F)(B C E F)(C F))

MAPLIST removes the first atom of both lists and performs the function on the two new lists. It then removes the next two atoms and performs the function on the two lists with the remaining atoms. This continues until there are no more atoms in one of the two lists. The lists do not have to contain the same number of atoms.

(MAPLIST APPEND '(A B C) '(D E F G H))
((A B C D E F G H)(B C E F G H)
 (C F G H))

MAPCAN and MAPCON are just like MAPCAR and MAPLIST, respectively except that they do not return lists that are made using LIST. MAPCAN and MAPCON use NCONC. NCONC takes the values from two lists and places all of them into the first, thereby destroying the original list. For example:

(SETQ x '(1 2 3 4) y '(5 6 7 8))
(NCONC x y)
(5 6 7 8)
(1 2 3 4 5 6 7 8)
x
(1 2 3 4 5 6 7 8)
y
(5 6 7 8)

NCONC put all eight values into "x" while it left "y" alone. Since it changed "x" it is considered destructive.An example using MAPCAN follows:

(MAPCAN (LAMBDA (x) (AND (NUMBERP x)              (SETQ y (SQRT x)) (LIST 
y)))'(2 3 4 5 A))
(1.41421356 1.73205080 2. 2.23606797)

The AND and the NUMBERP functions in the above, give indication as to when the numbers in the list end by having NUMBERP return nil from the letter "A". AND then stops evaluation. Otherwise the SETQ assigns the square root of each atom to "y" then places it within a list with LIST. Since MAPCAN was used each of the returned values were NCONCed into "y". If one used MAPCAR each value would be placed into a list represented by "y" which would then be placed into the resulting list. The SETQ changes "y" for each value and the resulting list is quite different.

(MAPCAR (LAMBDA (x) (AND (NUMBERP x)              (SETQ y (SQRT x)) (LIST 
y)))'(2 3 4 5 A))
((1.41421356)(1.73205080)(2.)
                     (2.23606797 ) nil)

MAPC and MAPL are also related to MAPCAR and MAPLIST, respectively. These functions are supposed to return the original input list of values instead of a list of resultant values. They are typically used for their side effect such as assigning a new value to a global variable. Unfortunately they don't seem to return results in this manner. Instead of returning the original input list, they both return nil.

EVERY is a totally different type of sequencing function. EVERY applies a predicate to each atom in a list.If the predicate returns "t" for each atom EVERY returns "t". If the predicate returns nil at least once so does EVERY.

(EVERY NUMBERP '(1 2 3 4 5))
t 
(EVERY NUMBERP '(1 2 A 4 5))
nil

One interesting feature about EVERY is that one may specify how EVERY will sequence through the list. Without specifying the sequence EVERY defaults to CDR as a step. For example, if we take the second EVERY example above and step through the list with a CDDDR, it returns "t" since the CDDDR makes the evaluation of the predicate skip the letter "A".

(EVERY NUMBERP '(1 2 A 4 5) cdddr)
t

FIND-IF applies a predicate function to each atom in a list until the predicate returns "t". FIND-IF returns the atom which satisfies the predicate then ends the evaluation.

(FIND-IF EVENP '(3 5 7 8 10))
8
(FIND-IF (lambda (x) (> x 5)) '(2 3 4 5 6 7 8))
6

FIND-IF-NOT does the exact opposite of FIND-IF. It returns the first atom of a list which does not satisfy the predicate.

(FIND-IF EVENP '(2 3 5 7 8))
3
(FIND-IF-NOT  (lambda (x) (> x 5)) '(2 3 4 5 6))
2

REDUCE performs a function that requires two inputs. It performs the function on the first two atoms of a list, starting from left to right, then performs the function upon the result of the first two with the very next atom. It then performs the same function with the second result with the next atom. It returns the result when no more atoms are available. For example the following multiplies a sequence of numeric values:

(REDUCE  * '(7 6 13 76))
41496

If one places a T before the last closing parenthesis REDUCE performs the same function on the list from right to left.

(REDUCE - '(7 6 13 76))
-88

The above is equal to (-(-(-7 6)13)76).

 (REDUCE - '(7 6 13 76) T) 
-62

The above is now equal to (- 7 (- 6 (- 13 76))).

NOTANY is the equivalent of (NOT (EVERY.... It returns "t" if none of the atoms of a list satisfy the given predicate.

NOTEVERY is the same as FIND-IF-NOT. However, instead of returning the value that did not satisfy the predicate NOTEVERY returns "t" as follows:

(NOTEVERY  (lambda (x) (> x 5)) '(2 3 4 5 6))
t

Besides MAPC and MAPL there is one more mapping function which not only doesnt work as the literature (Common Lisp by Guy Steele) describes it, but just doesnt seem to work in ExperLisp version 1.04. This function is called SOME. SOME is supposed to look successively to the elements of a list and stop when it finds an element which satisfies a predicate function. The following should return the number five:

(defun try (x)
  (oddp x))

(SOME try '(2 4 5))

Instead of returning "5" after the defined function name, "unbound variable f" is returned along with a dump of what seems to be the heap.We will be talking to ExperTelligence about the status of these functions.

Last month I mentioned that we would be starting a tutorial on ExperOps5 in this month's issue. Unfortunately, the author of that segment did not make the deadline. We hope to start the tutorial as soon as we can, if it is possible, in coming Mactutor issues. Instead, we are again treated to a nifty program by Dean Ritz of ExperTelligence. The following functions build a small pyramid-like object in three dimensions. Three controls are also produced as seen in Figure 1. These controls rotate the object along three different planes and at varying speeds. After compiling, type (Tetrahedron) into the Listener window and enjoy!

By the way, Happy Holidays!

;••••••••••••••••••••••••••••••••
;TETRAHEDRON animates a tetrahedron rotating in ;3-Dimensional space. 
 
;It allows a person to adjust the rate of rotation
;through the use of mouse sensative controls.
;Produced by Dean Ritz of ExperTelligence
(defun tetrahedron (&aux (curbun (new3dbun)))
  (setq xx 0
        yy 0
        zz 0
        xboxes '((60  -100  80  -80) (60  -80  80  -60))
        yboxes '((60  -40  80  -20) (60  -20  80  0))
        zboxes '((60  20  80  40) (60  40  80  60))
        quit '(60  80  80  120)
        std_graf (newgrafwindow '(45 5 310 500)))
  (std_graf 'setwtitle "ExperTetrahedron")
  (std_graf 'showwindow)
  (std_graf 'selectwindow)
  (textface 0) (pendown)
  (draw.controls)
  (penup) (home) (forward 40)
  (pendown)
  (catch 'flag (doit 1))
  (disposhandle (coercetype $68 curbun))
  (std_graf 'closewindow))

(defmacro rac (l)
  `(car (last ,l)))

;Hitting a key represent
(defun doit (tt &aux speed)
  (cond ((keyp) 
         (setq speed (read-char))
         (if (numberp speed) (setq tt speed))))
  (if (button) (adjust.controls))
  (roll yy)
  (pitch xx)
  (yaw zz)
  (fillrect '(-130 -100 50 100) white)
  (dotimes  (i tt) (tetra 70))
  (doit tt))

;* * * * * * * * * * * * * * * * *
;DRAW.CONTROLS draws the mouse sensative controls.

(defun draw.controls ()
  (moveto -100 75)
  (drawstring "  -   +")
  (framerect (car xboxes))
  (framerect (rac xboxes))
  (moveto -40 75)
  (drawstring "  -   +")
  (framerect (car yboxes))
  (framerect (rac yboxes))
  (moveto 20 75)
  (drawstring "  -   +")
  (framerect (car zboxes))
  (framerect (rac zboxes))
  (moveto 80 75)
  (drawstring "  Quit")
  (framerect quit)
  (moveto -100 100)
  (drawstring " Roll         Pitch        Yaw"))

;* * * * * * * * * * * * * * * * *
;ADJUST.CONTROLS is only called if the mouse button is ;depressed.
;It is responsible for calling the commands which adjust the
;rotation of the tetrahedron.  It also sets the QUIT flag if
;the mouse is clicked in the "Quit" box.
(defun adjust.controls (&aux (point (getmouse)))
  (cond ((pt.in.rect (car point) (rac point) '(60 -100 80 -60))
         (apply adjust.x point))
        ((pt.in.rect (car point) (rac point) '(60 -40 80 0))
         (apply adjust.y point))
        ((pt.in.rect (car point) (rac point) '(60 20 80 60))
         (apply adjust.z point))
        ((pt.in.rect (car point) (rac point) quit)
         (invertrect quit)
         (wait) (invertrect quit)
         (throw 'flag))))

;* * * * * * * * * * * * * * * * * 
;The three commands ADJUST.X, ADJUST.Z, and ADJUST.Y ;are only
;called if the mouse is clicked while on one of the controls.
;It inverts the proper button (box), increments a global
;variable for moving the bunny, waits for the mouse button to
;be released, and then re-inverts the button.
(defun adjust.x (x y)
  (cond ((pt.in.rect x y (car xboxes))
         (invertrect (car xboxes))
         (setq xx (- xx 2))
         (wait)
         (invertrect (car xboxes)))
        (t 
          (invertrect (rac xboxes))
          (setq xx (+ xx 2))
          (wait)
          (invertrect (rac xboxes)))))

(defun adjust.z (x y)
  (cond ((pt.in.rect x y (car zboxes))
         (invertrect (car zboxes))
         (setq zz (- zz 2))
         (wait)
         (invertrect (car zboxes)))
        (t
          (invertrect (rac zboxes))
          (setq zz (+ zz 2))
          (wait)
          (invertrect (rac zboxes)))))

(defun adjust.y (x y)
  (cond ((pt.in.rect x y (car yboxes))
         (invertrect (car yboxes))
         (setq yy (- yy 2))
         (wait)
         (invertrect (car yboxes)))
        (t
          (invertrect (rac yboxes))
          (setq yy (+ yy 2))
          (wait)
          (invertrect (rac yboxes)))))

;* * * * * * * * * * * * * * * * * 

;WAIT waits until the mouse button
; is depressed.Then it returns control
; to the calling function.
(defun wait ()
  (prog ()
        top
        (if (button) 
            (go top))))

;* * * * * * * * * * * * * * * * * 
;TETRA and PART draw a tetrahedron 
 ;using 3-D bunny graphics.
(defun tetra (s)
 (dotimes (i 3) 
          (part s) (roll 90) 
          (lt -45) (fd s) 
          (bk s) (lt 45) (roll -90)))

(defun part (s)
 (lt 45) (fd s) (rt 45)
 (pitch 90)
 (rt 45) (fd s) (bk s) (lt 45)
 (roll -90))

;* * * * * * * * * * * * * * * * * 

;PT.IN.RECT tests to see whether an specific X and Y ;coordiate
;lies within a given boundary rectangle :RECT.
;RECT whould be a list of [TOP LEFT BOTTOM RIGHT] ;coordinates.
(defun pt.in.rect (x y rect)
  (and (< x (nth 3 rect))
       (  x (nth 1 rect))
       (¾ y (nth 2 rect))
       (  y (nth 0 rect))
       t))  ;returns T if true, NIL otherwise
 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Airmail 3.3.2 - Powerful, minimal email...
Airmail is an mail client with fast performance and intuitive interaction. Support for iCloud, MS Exchange, Gmail, Google Apps, IMAP, POP3, Yahoo!, AOL, Outlook.com, Live.com. Airmail was designed... Read more
Numi 3.15.1 - Menu-bar calculator suppor...
Numi is a calculator that magically combines calculations with text, and allows you to freely share your computations. Numi combines text editor and calculator Support plain English. For example, '5... Read more
Airmail 3.3.2 - Powerful, minimal email...
Airmail is an mail client with fast performance and intuitive interaction. Support for iCloud, MS Exchange, Gmail, Google Apps, IMAP, POP3, Yahoo!, AOL, Outlook.com, Live.com. Airmail was designed... Read more
Numi 3.15.1 - Menu-bar calculator suppor...
Numi is a calculator that magically combines calculations with text, and allows you to freely share your computations. Numi combines text editor and calculator Support plain English. For example, '5... Read more
TextSoap 8.4.1 - Automate tedious text d...
TextSoap can automatically remove unwanted characters, fix up messed up carriage returns, and do pretty much anything else that we can think of to text. Save time and effort. Be more productive. Stop... Read more
TextSoap 8.4.1 - Automate tedious text d...
TextSoap can automatically remove unwanted characters, fix up messed up carriage returns, and do pretty much anything else that we can think of to text. Save time and effort. Be more productive. Stop... Read more
Backblaze 4.3.0.44 - Online backup servi...
Backblaze is an online backup service designed from the ground-up for the Mac. With unlimited storage available for $5 per month, as well as a free 15-day trial, peace of mind is within reach with... Read more
Numi 3.15 - Menu-bar calculator supports...
Numi is a calculator that magically combines calculations with text, and allows you to freely share your computations. Numi combines text editor and calculator Support plain English. For example, '5... Read more
EtreCheck 3.3.3 - For troubleshooting yo...
EtreCheck is an app that displays the important details of your system configuration and allow you to copy that information to the Clipboard. It is meant to be used with Apple Support Communities to... Read more
BusyContacts 1.1.8 - Fast, efficient con...
BusyContacts is a contact manager for OS X that makes creating, finding, and managing contacts faster and more efficient. It brings to contact management the same power, flexibility, and sharing... Read more

Latest Forum Discussions

See All

The best new games we played this week
We were quite busy this week. A bunch of big mobile games launched over the past few days, alongside a few teeny surprises. There're lots of quality games to load your phone with. We've gone and picked out five of our favorites for the week. [... | Read more »
Magikarp Jump beginner's guide
Magikarp Jump is a mystifying little game. Part Tamagotchi, part idle clicker, there's not a whole lot of video game there, per se, but for some reason we can't help coming back to it again and again. Your goal is to train up a little Magikarp to... | Read more »
Goat Simulator PAYDAY (Games)
Goat Simulator PAYDAY 1.0 Device: iOS Universal Category: Games Price: $4.99, Version: 1.0 (iTunes) Description: ** IMPORTANT - SUPPORTED DEVICES **iPhone 4S, iPad 2, iPod Touch 5 or better Goat Simulator: Payday is the most... | Read more »
GRID Autosport delayed until autumn
Sorry mobile racing fans -- GRID Autosport has been delayed a few months. The game is now expected to launch this fall on iOS. Feral Interactive announced that they wanted more time to work on the game's UI and overall performance before launching... | Read more »
Zombie Gunship Survival Beginner's...
The much anticipated Zombie Gunship Survival is here. In this latest entry in the Zombie Gunship franchise, you're tasked with supporting ground troops and protecting your base from the zombie horde. There's a lot of rich base building fun, and... | Read more »
Mordheim: Warband Skirmish (Games)
Mordheim: Warband Skirmish 1.2.2 Device: iOS Universal Category: Games Price: $3.99, Version: 1.2.2 (iTunes) Description: Explore the ruins of the City of Mordheim, clash with other scavenging warbands and collect Wyrdstone -... | Read more »
Mordheim: Warband Skirmish brings tablet...
Legendary Games has just launched Mordheim: Warband Skirmish, a new turn-based action game for iOS and Android. | Read more »
Magikarp Jump splashes onto Android worl...
If you're tired ofPokémon GObut still want something to satisfy your mobilePokémon fix,Magikarp Jumpmay just do the trick. It's out now on Android devices the world over. While it looks like a simple arcade jumper, there's quite a bit more to it... | Read more »
Purrfectly charming open-world RPG Cat Q...
Cat Quest, an expansive open-world RPG from former Koei-Tecmo developers, got a new gameplay trailer today. The video showcases the combat and exploration features of this feline-themed RPG. Cat puns abound as you travel across a large map in a... | Read more »
Jaipur: A Card Game of Duels (Games)
Jaipur: A Card Game of Duels 1.0 Device: iOS Universal Category: Games Price: $1.99, Version: 1.0 (iTunes) Description: ** WARNING: iPad 2, iPad Mini 1 & iPhone 4S are NOT compatible. ** *** Special Launch Price for a limited... | Read more »

Price Scanner via MacPrices.net

Memorial Day savings: 13-inch Touch Bar MacBo...
B&H Photo has the 2016 Apple 13″ Touch Bar MacBook Pros in stock today and on sale for up to $150 off MSRP. Shipping is free, and B&H charges NY & NJ sales tax only: - 13″ 2.9GHz/512GB... Read more
Apple refurbished 13-inch MacBook Airs availa...
Apple has Certified Refurbished 2016 13″ MacBook Airs available starting at $849. An Apple one-year warranty is included with each MacBook, and shipping is free: - 13″ 1.6GHz/8GB/128GB MacBook Air: $... Read more
Apple restocks refurbished 11-inch MacBook Ai...
Apple has Certified Refurbished 11″ MacBook Airs (the latest models recently discontinued by Apple), available for up to $170 off original MSRP. An Apple one-year warranty is included with each... Read more
12-inch 1.2GHz Retina MacBooks on sale for up...
B&H has 12″ 1.2GHz Retina MacBooks on sale for up to $150 off MSRP. Shipping is free, and B&H charges NY & NJ sales tax only: - 12″ 1.2GHz Space Gray Retina MacBook: $1449.99 $150 off... Read more
15-inch 2.7GHz Silver Touch Bar MacBook Pro o...
MacMall has the 15-inch 2.7GHz Silver Touch Bar MacBook Pro (MLW82LL/A) on sale for $2569 as part of their Memorial Day sale. Shipping is free. Their price is $230 off MSRP. Read more
Free Tread Wisely Mobile App Endorsed By Fath...
Just in time for the summer driving season, Cooper Tire & Rubber Company has announced the launch of a new Tread Wisely mobile app. Designed to promote tire and vehicle safety among teens and... Read more
Commercial Notebooks And Detachable Tablets W...
Worldwide shipments of personal computing devices (PCDs), comprised of traditional PCs (a combination of desktop, notebook, and workstations) and tablets (slates and detachables), are forecast to... Read more
Best value this Memorial Day weekend: Touch B...
Apple has Certified Refurbished 2016 15″ and 13″ MacBook Pros available for $230 to $420 off original MSRP. An Apple one-year warranty is included with each model, and shipping is free: - 15″ 2.6GHz... Read more
13-inch MacBook Airs on sale for up to $130 o...
Overstock.com has 13″ MacBook Airs on sale for up to $130 off MSRP including free shipping: - 13″ 1.6GHz/128GB MacBook Air (sku MMGF2LL/A): $869.99 $130 off MSRP - 13″ 1.6GHz/256GB MacBook Air (sku... Read more
2.8GHz Mac mini available for $973 with free...
Adorama has the 2.8GHz Mac mini available for $973, $16 off MSRP, including a free copy of Apple’s 3-Year AppleCare Protection Plan. Shipping is free, and Adorama charges sales tax in NY & NJ... Read more

Jobs Board

*Apple* Retail - Multiple Positions - Apple,...
Job Description: Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
*Apple* Media Products - Commerce Engineerin...
Apple Media Products - Commerce Engineering Manager Job Number: 57037480 Santa Clara Valley, California, United States Posted: Apr. 18, 2017 Weekly Hours: 40.00 Job Read more
*Apple* Media Products - Commerce Engineerin...
Apple Media Products - Commerce Engineering Manager Job Number: 57037480 Santa Clara Valley, California, United States Posted: Apr. 18, 2017 Weekly Hours: 40.00 Job Read more
Best Buy *Apple* Computing Master - Best Bu...
**509643BR** **Job Title:** Best Buy Apple Computing Master **Location Number:** 001482- Apple Valley-Store **Job Description:** **What does a Best Buy Apple Read more
*Apple* Media Products - Commerce Engineerin...
Apple Media Products - Commerce Engineering Manager Job Number: 57037480 Santa Clara Valley, California, United States Posted: Apr. 18, 2017 Weekly Hours: 40.00 Job Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.