TweetFollow Us on Twitter

Recursion and Windows
Volume Number:1
Issue Number:11
Column Tag:Lisp Listener

Recursion and Windows

By Andy Cohen, Human Factors Engineer, MacTutor Contributing Editor

MacScheme offers an Alternative

This month I am happy to announce that there is now a third Lisp environment available for the Mac. The first was XLisp (which is now in version 5, which included some quickdraw routines), the second was ExperLisp (see below for the current version number) and the third is called MacScheme from Semantic Micro Systems in Beaverton, Oregon. MacScheme is an implementation of Scheme, which is actually an idealized version of Common Lisp which was proposed by Guy Steele. MacScheme is implemented on the Macintosh in a different way then ExperLisp or XLisp. I will give the details of how it was developed in a more detailed review in the near future. For now though I can say that it will have the capability to manipulate over 20,000 cons cells with just a 512K Mac. I'm also told that a Levco MonsterMac (2 mbyte) using Macscheme can have approximately 120,000 cons cells. In contrast, ExperLisp can only create 5,912 cons cells in a 512K Mac and 30,480 in a MonsterMac. Macscheme however, will not have the bells and whistles that ExperLisp has. There is currently no way in Macscheme to access the Mac's rom toolbox. John Ulrich, one of the developers of Macscheme tells me that in time they eventually will be able to access the toolbox. Macscheme does use the standard Macintosh user-interface. It uses the menu bar and can produce up to four windows. These windows contain things like a compiler, an editor, a debugger (!) and a Listener window. It is supposedly as interactive as ExperLisp. One can compile and evaluate a single line from the Listener window or compile an entire file. There are two more aspects to Macscheme which I feel are almost as significant as it's capacity; cost and copy protection. The cost is extremely low, $125.00 and it is not copy protected. It can easily be put onto a hard disk or a RAM disk for more speed during startup. As soon as I get Macscheme I will give a more detailed review. I hope to include some benchmarks and a better comparison to ExperLisp.

SIMPLE RECURSION

Recursion is one of the most basic control structures in Lisp. To recur is to occur again. A recursive structure or function is one which is essentially iterative in that it is repetitive. Recursive structures or functions are different from iterative procedures in that they call themselves repeatedly in a circular fashion in order to solve a problem. The recursion ends when the solution is computed. For example, suppose one needed to know how fast a printer can print a certain number of pages. Let us assume that we already know it takes .763 minutes per page. We have also just learned that a certain Masters thesis is 72 pages long. Well, we could just simply multiply .763 by 72, however that would not be an example of recursion. Multiplication would be the easy way. Let's try the hard way. What the following will do is add the time per page (.763) to a variable, which I have called timecount, once for each page.

(setq timecount 0)
(defun Printtime (pagenum)
(setq timecount (+ timecount .763)) 
    (cond ((= 1 pagenum) timecount)
    (t (Printtime (sub1 pagenum)))))

(Printtime 72)
;54.936

When the above is compiled, "timecount" is assigned the value zero. When "Printtime" is called the value sent with the call is the number of pages (pagenum). The second line of Printtime reassigns to "timecount" the value of the sum of the previous value of timecount and the number .763. The next line is a conditional which tests the value of pagenum. If pagenum is one, the "=" predicate returns "t", the value of timecount is displayed and the procedure is terminated. If pagenum is not equal to the number one then the equal predicate returns "nil" and the next line is evaluated. The third line forces it's evaluation by virtue of the "t" at the beginning of the list. This list then calls the very same defined function, however the parameter ,"pagenum" is decremented by one. This continues until pagenum equals zero. The time it took the printer to print the given number of pages is then displayed. In the case of 72 pages it took 54.936 minutes (it was probably high quality!).

Sometimes it requires more than one function to solve a problem. Two-part recursion is when one function calls a second and the second function does all the work. Since we actually need to have the variable "timecount" set to zero every time we use the function it can be more efficiently implemented in terms of our Lisp environment as a two-part recursive function.

(defun setup (n)
   (setq timecount 0)
   (Printtime n))

(defun Printtime (pagenum)
    (setq timecount (+ timecount .763)) 
    (cond ((zerop pagenum) timecount)
    (t (Printtime (sub1 pagenum)))))

(setup 72)
; 54.936
(setup 90)
;68.67 
(setup 12)
;9.156 
(setup 32)
;24.416 

Given the above, one can now solve the problem without having to compile the entire source listing everytime. Using "setup" which calls "Printtime" the variable timecount is initiated without recompiling. Note that the value represented by variable "n" is passed to Printtime which then assigns it to "pagenum". If one was to call Printtime after compiling and running the above, the last number assigned to timecount will still be assigned. Therefore, the number returned is the total of the last total time plus the number of pages given when Printtime was called by itself. Recursion is an important feature of Lisp. The above was a very simple example. In next month's column I'll discuss more complicated recursive functions.

Windows!

Yes, ExperLisp does do windows. After months of saying that I'll show how, I've finally got around to doing it. As you might already know from previous months, one may generate a window by simply accessing either the Bunny or Quickdraw graphics routines available in ExperLisp. In this case the window is the standard graphics window or "Std_graf" to ExperLisp. "Std_graf" is the term used by ExperLisp in referring to a window. One may associate a "Std_graf" with their own window by assigning the special term "newgraphwindow" and a list containing a set of coordinates (which correspond to the top left and bottom right corners of the window) to the chosen term which identifies the window. For my example the term I have chosen is "Win1". After this assignment is made one must then assign the name "Win1" to the special term "Std_graf". To assign a title to the window which will be displayed on top of the window the special term "setwtitle" is used. My sample follows:

(setq Win1 (newgrafwindow '(90 115 290 335))
           std_graf Win1))
 (Win1 'setwtitle "My First Window")

The above will generate a window which does not contain scroll bars or an expand corner. Expanding the window or shrinking it however, is possible by placing the mouse on the lower right corner and dragging it to the desired size. One might note that after running the above, the window is covered up by the Listener Window. It has to be selected before it can be changed or moved. This is because when there is no other functions operating the Listener Window becomes the active window. In order to keep the programmed window active one must be within a procedure which selected it or a procedure which is called by a previous procedure which selected the window. Figure 1 is a screen dump of what the window looks like on the ExperLisp desktop. The screen dump also contains the output generated within the Listener window as a result of the window creation. Windows can also be selected via quickdraw routines. For example:

(FILLOVAL '(34 67 89 90) dkgrey Win1)

The window is selected by including the window title at the end of the quickdraw routine. The window can be deleted by using the following:

(CLOSEWINDOW)

One can size a window using the following:

(SIZEWINDOW width height)

One can also HIDEWINDOW, SHOWWINDOW, MOVEWINDOW x y, or SENDBEHIND window. All of the window primitives are as easy to use as those sampled above.

Putting It All Together

Now lets' put all that has been discussed over the last couple of months together into a simple bunch of procedures which will allow the user to draw a black rectangle with the mouse into the window generated by the code described above.

(defun Watch ()
 (Win1 'selectwindow) 
   (prog ()
     look
      (if (button) (Mousey (REVERSE (getmouse))))
       (go look)))

(defun Mousey (x) 
      (prog ()
     try
         (setq inputs (append x (REVERSE(getmouse))))
          (framerect inputs)
          (eraserect inputs)
          (if (not(button)) (halt x) (go try))))

(defun halt (x)
   (paintrect (append x (REVERSE (getmouse)))))

(Watch)

The overall structure of the above is the same as that used with the procedures presented last month which printed the mouse location. When "Watch" is called, the window "Win1" is selected and brought to the front. The procedure "Watch" also scans the mouse awaiting a button press. When the button on the mouse is pressed the X-Yvalues of the mouse position are reversed (to correspond to the top-left of the quickdraw syntax) and sent in a list as a parameter to the procedure "Mousey". Mousey appends together a list made up of the passed parameter "x" and a second (REVERSE (GETMOUSE)). This list is assigned to the symbol "inputs", which is then used in the FRAMERECT. The FRAMERECT is immediately erased using ERASERECT to give the outline effect prior to releasing the button and selecting the rectangle size. When the button is released the procedure "Halt" is called with the exact same value passed to it as the value passed to "Mousey". It is still the top, left hand corner of our rectangle. In "Halt" the rectangle is finally drawn using the latest mouse position for the bottom, right hand corner.

When compiling these routines one should see each function name printed in the Listener Window as the function is compiled. If the name does not appear and the "I" beam cursor reappears, there is a typo. Chances are it is a problem with the parentheses. If the names show up but the functions are not initiated, chances are a parenthesis was left out somewhere. The above should work fine. One of the biggest disadvantages in using ExperLisp at this time is the poor error messages given when the programmer has done something wrong. I find that most of my errors are in leaving out a parenthesis or putting too many in. Parentheses matching is a capability inherent in an editor which gives some indication to the programmer as to which parenthesis goes with another. Some Lisp machines actually put the parenthesis in for the programmer automatically. In version 1.04 of ExperLisp we will be given the luxury of parenthesis matching. Version 1.04 should be released by the time this column is in print. This new version of ExperLisp will handle parenthesis matching by highlighting the opening parenthesis of the matching closing parenthesis to the left of the entry point. By placing the entry point next to each closing parenthesis the programmer can check to see that all the lists are closed properly. Believe me, after just two minutes of use you will never want to be without parenthesis matching again! Another helpful feature of version 1.04 is a form of trace capability. In the beta version this capability was initiated within the ªlispINIT file. When certain kinds of errors are encountered the same kind of message is generated as was in the earlier versions, however with this form of trace on the message is followed by each list that was invoked and the order of occurrence. These are generated in the Listener window. There is a drawback to this feature though, the listing can get quite long for even a small program. The best way to debug at this time is still to break the code down into small functions.

ExperLisp Versions

There are currently four versions of ExperLisp. Version 1.01 was the first release. The first update was version 1.02, in which some of the routines were fixed (i.e. MAPCAR and nested CARs and CDRs, etc.) and some routines added (i.e. FREECONS). Version 1.03 is a version of ExperLisp which was included with ExperOps5. Registered owners of both ExperLisp and ExperOps5 should receive version 1.04. There are many differences between each of these versions. To see what routines and functions are available within a version of ExperLisp type the following in the Listener window:

(APROPOS "")

The function names will then be generated within the Listener window. Good luck, the list is long.

The Experts Complain

Recently a letter was received by Mactutor which criticized the accuracy and reliability of this column. I would like to say that I am NOT a Lisp programmer. That is probably obviously apparent to one who is. The goal of this article is to be more then just a tutorial, it is to demonstate the findings of one who is learning Lisp ON THE MAC with only minor consulting from the experts. If you feel something is incorrect, then by all means write to Mactutor with your comments. We welcome suggestions for topics of interest to our readership. Let us know how we can meet your needs.

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Apple Pro Video Formats 2.0.2 - Updates...
Apple Pro Video Formats brings updates to Apple's professional-level codes for Final Cut Pro X, Motion 5, and Compressor 4. Version 2.0.2: Includes support for the following professional video codecs... Read more
Apple Final Cut Pro X 10.2.2 - Professio...
Apple Final Cut Pro X is a professional video editing solution.Completely redesigned from the ground up, Final Cut Pro adds extraordinary speed, quality, and flexibility to every part of the post-... Read more
Apple Compressor 4.2.1 - Adds power and...
Compressor adds power and flexibility to Final Cut Pro X export. Customize output settings, work faster with distributed encoding, and tap into a comprehensive set of delivery features. Powerful... Read more
Apple Motion 5.2.2 - Create and customiz...
Apple Motion is designed for video editors, Motion 5 lets you customize Final Cut Pro titles, transitions, and effects. Or create your own dazzling animations in 2D or 3D space, with real-time... Read more
A Better Finder Rename 10.00b1 - File, p...
A Better Finder Rename is the most complete renaming solution available on the market today. That's why, since 1996, tens of thousands of hobbyists, professionals and businesses depend on A Better... Read more
CrossOver 14.1.6 - Run Windows apps on y...
CrossOver can get your Windows productivity applications and PC games up and running on your Mac quickly and easily. CrossOver runs the Windows software that you need on Mac at home, in the office,... Read more
Printopia 2.1.14 - Share Mac printers wi...
Run Printopia on your Mac to share its printers to any capable iPhone, iPad or iPod Touch. Printopia will also add virtual printers, allowing you to save print-outs to your Mac and send to apps.... Read more
Google Drive 1.24 - File backup and shar...
Google Drive is a place where you can create, share, collaborate, and keep all of your stuff. Whether you're working with a friend on a joint research project, planning a wedding with your fiancé, or... Read more
Chromium 45.0.2454.85 - Fast and stable...
Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all Internet users to experience the web. Version 45.0.2454.85: Note: Does not contain the "... Read more
OmniFocus 2.2.5 - GTD task manager with...
OmniFocus helps you manage your tasks the way that you want, freeing you to focus your attention on the things that matter to you most. Capturing tasks and ideas is always a keyboard shortcut away in... Read more

Zen Brush 2 (Entertainment)
Zen Brush 2 1.0 Device: iOS Universal Category: Entertainment Price: $2.99, Version: 1.0 (iTunes) Description: Zen Brush 2 is a drawing app focused on the strong yet beautiful feel of the East Asian ink brush. | Read more »
NetNewsWire (News)
NetNewsWire 4.0.0 Device: iOS iPhone Category: News Price: $3.99, Version: 4.0.0 (iTunes) Description: Follow the Web NetNewsWire 4, completely written from the ground up for iPhone. NetNewsWire is the best way to keep up with the... | Read more »
Huzzah! Farming Simulator 16 Supports Cl...
As though it weren't difficult enough to resist the siren call of Farming Simulator 16, now it's been updated with cloud saves - so you can jump between devices without missing any of that precious crop-harvesting time. [Read more] | Read more »
Don't Starve: Pocket Edition Finall...
I've made no effort to hide my enjoyment of Don't Starve: Pocket Edition, but I will admit I was a tiny bit disappointed that it was only available for the iPad. Well nuts to that, because Klei Entertainment has made it universal! [Read more] | Read more »
Goat Simulator Wasn't Enough? Then...
If you just didn't get enough goat in Goat Simulator - or if you've been wanting to play a simulated MMO as a microwave - then you're in luck! Goat Simulator MMO Simulator is out now, and it's a game about simulated goats in simulated MMOs. Plus... | Read more »
You Can Play Madfinger Games' Unkil...
Madfinger Games - probably best known for the Dead Trigger series - has officially launched their newest zombie shooter (that isn't called Dead Trigger), named Unkilled. [Read more] | Read more »
KORG iELECTRIBE for iPhone (Music)
KORG iELECTRIBE for iPhone 1.0.1 Device: iOS iPhone Category: Music Price: $9.99, Version: 1.0.1 (iTunes) Description: ** 50% OFF Special Launch Sale - For a Limited Time **The ELECTRIBE reborn in an even smaller form A full-fledged... | Read more »
Toca Life: City Just Got a Bunch of New...
Toca Life: City is Toca Boca's most popular app (number 1 in 47 different countries, apparently), and it's just had an update that adds a bunch of new content. [Read more] | Read more »
My Country 3D is More About Cities than...
My Country 3D is an upcoming city builder from Game Insight that looks pretty decent - although the name seems a tad out of whack for a city builder. Ah well, it is what it is. [Read more] | Read more »
I am Bread (Games)
I am Bread 1.0 Device: iOS Universal Category: Games Price: $4.99, Version: 1.0 (iTunes) Description: ‘I am Bread’ is the latest quirky adventure from the creators of 'Surgeon Simulator', Bossa Studios. This isn't the best thing... | Read more »

Price Scanner via MacPrices.net

Near-Office Input Functionality Virtually Any...
Today Logitech introduced the Logitech K380 Multi-Device Bluetooth Keyboard and the Logitech M535 Bluetooth Mouse, giving users the freedom to work on any device, most anywhere. According to... Read more
College Student Deals: Additional $100 off Ma...
Take an additional $100 off all MacBooks and iMacs at Best Buy Online with their College Students Deals Savings, valid through September 4, 2015. Anyone with a valid .EDU email address can take... Read more
2.8GHz Mac mini available for $988, includes...
Adorama has the 2.8GHz Mac mini available for $988, $11 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
Will You Buy An iPad Pro? – The ‘Book Mystiqu...
It looks like we may not have to wait much longer to see what finally materializes as a new, larger-panel iPad (Pro/Plus?) Usually reliable Apple product prognosticator KGI Securities analyst Ming-... Read more
eFileCabinet Announces SMB Document Managemen...
Electronic document management (EDM) eFileCabinet, Inc., a hosted solutions provider for small to medium businesses, has announced that its SecureDrawer and eFileCabinet Online services will be... Read more
WaterField Designs Unveils American-Made, All...
San Francisco’s WaterField Designs today unveiled their all-leather Cozmo 2.0 — an elegant attach laptop bag with carefully-designed features to suit any business environment. The Cozmo 2.0 is... Read more
Apple’s 2015 Back to School promotion: Free B...
Purchase a new Mac or iPad at The Apple Store for Education and take up to $300 off MSRP. All teachers, students, and staff of any educational institution qualify for the discount. Shipping is free,... Read more
128GB MacBook Airs on sale for $100 off MSRP,...
B&H Photo has 11″ & 13″ MacBook Airs with 128GB SSDs on sale for $100 off MSRP. Shipping is free, and B&H charges NY sales tax only: - 11″ 1.6GHz/128GB MacBook Air: $799.99, $100 off MSRP... Read more
13-inch 2.5GHz MacBook Pro (refurbished) avai...
The Apple Store has Apple Certified Refurbished 13″ 2.5GHz MacBook Pros available for $829, or $270 off the cost of new models. Apple’s one-year warranty is standard, and shipping is free: - 13″ 2.... Read more
27-inch 3.2GHz iMac on sale for $1679, save $...
B&H Photo has the 27″ 3.2GHz iMac on sale for $1679.99 including free shipping plus NY sales tax only. Their price is $120 off MSRP. Read more

Jobs Board

*Apple* Retail - Multiple Customer Support P...
Job Description: Customer Support Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the Read more
*Apple* Desktop Analyst - KDS Staffing (Unit...
…field and consistent professional recruiting achievement. Job Description: Title: Apple Desktop AnalystPosition Type: Full-time PermanentLocation: White Plains, NYHot Read more
Simply Mac *Apple* Specialist- Repair Techn...
Simply Mac is the greatest premier retailer of Apple products expertise in North America. We're looking for dedicated individuals to provide personalized service and Read more
Simply Mac *Apple* Specialist- Service Repa...
Simply Mac is the greatest premier retailer of Apple products expertise in North America. We're looking for dedicated individuals to provide personalized service and Read more
*Apple* Desktop Analyst - KDS Staffing (Unit...
…field and consistent professional recruiting achievement. Job Description: Title: Apple Desktop AnalystPosition Type: Full-time PermanentLocation: White Plains, NYHot Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.