RE: Python fruit basket program with no indentation

  • From: Jamal Mazrui <empower@xxxxxxxxx>
  • To: programmingblind@xxxxxxxxxxxxx
  • Date: Thu, 9 Apr 2009 10:55:49 -0400 (EDT)

Not sure if this is significantly less icky <grin>, but below is another
version that seperates tasks on different lines within the Add and Delete
event handlers.  It illustrates a couple more techniques (unbalanced
parens and backslash character).

Jamal

"""
Fruit basket program in Python with no indentation
Public domain by Jamal Mazrui

The indentation requirement of the Python programming language aids
its visual readability, but poses perhaps its biggest challenge to
blind users of speech output.  The challenge is manageable, as
demonstrated by a number of successful blind programmers.  Techniques
typically focus on ways of efficiently querying or adjusting
indentation with speech in order to follow the logical structure of
code.

This sample program instead uses techniques that avoid the need for
indentation, itself, by exploiting other features of the language.
The Python code is valid and functional, though not conventional in
style.

The first technique defines a function for executing a block of
statements in an in-line event handler -- also called an 'anonymous
delegate.'  The multiple lines of code are enclosed in a triple
quoted string.  At runtime, the custom execute function is called by
the built-in lambda function, which must be passed an expression
rather than statement(s).

Within event handling code, parts of a compound statement are put on
a single logical line that is split among multiple physical lines.
In the Add handler, a tuble is used to combine sequential tasks.
The unbalanced opening parenthesis on the line that starts the tuple
enables each of its expression items to be placed on a seperate
line.  In the Delete handler, a semicolon (;) and backslash (\) are
used, as well as an in-line 'if' expression.

The resulting program implements the criteria of a fruit basket
program in Python without needing any indentation.  Moreover, the
code is more scripting-like because all variables defined are
accessible globally, and no explicit class structures are needed.
The techniques are not necessarily recommended, but they hopefully
show additional possibilities for overcoming the indentation
requirement of a popular language.
"""

# Import wxWidgets package
import wx

# Define function that executes a block of statements
def execute(sCode): exec sCode

# Initialize program and dialog
app = wx.PySimpleApp()
dlg = wx.Dialog(parent=None, title='Fruit Basket')

# Handle Close event
dlg.Bind(wx.EVT_CLOSE, lambda event: execute("""
if wx.MessageBox('Exit program?', 'Confirm', wx.YES_NO) == wx.YES:
dlg.Destroy()
"""))

# Define first row of controls
lblFruit = wx.StaticText(parent=dlg, label='&Fruit:')
txtFruit = wx.TextCtrl(parent=dlg)
btnAdd = wx.Button(parent=dlg, label='&Add')

# Handle Add event
btnAdd.SetDefault()
btnAdd.Bind(wx.EVT_BUTTON, lambda event: execute("""
sFruit = txtFruit.GetValue()
if len(sFruit ) == 0: wx.MessageBox('No fruit to add!', 'Alert')
else: (
lstBasket.Insert(sFruit, 0),
lstBasket.SetSelection(0),
txtFruit.Clear()
)
"""))

# Define second row of controls
lblBasket = wx.StaticText(parent=dlg, label='&Basket:')
lstBasket = wx.ListBox(parent=dlg)
btnDelete = wx.Button(parent=dlg, label='&Delete')

# Handle Delete event
btnDelete.Bind(wx.EVT_BUTTON, lambda event: execute("""
iIndex = lstBasket.GetSelection()
iCount = lstBasket.GetCount()
if iIndex == -1: wx.MessageBox('No fruit to delete!', 'Alert')
else:\
lstBasket.Delete(iIndex);\
 lstBasket.SetSelection(min(iIndex, iCount)) if iCount > 1 else None
"""))

# Define layout sizer
sizer = wx.FlexGridSizer(cols=3, hgap=6, vgap=8)
for widget in (lblFruit, txtFruit, btnAdd, lblBasket, lstBasket,
btnDelete): sizer.Add(widget)
dlg.SetSizerAndFit(sizer)

# Activate dialog and run program
dlg.Show()
app.MainLoop()

On Tue, 7 Apr 2009, Ken Perry wrote:

> Date: Tue, 7 Apr 2009 22:19:38 -0400
> From: Ken Perry <whistler@xxxxxxxxxxxxx>
> Reply-To: programmingblind@xxxxxxxxxxxxx
> To: programmingblind@xxxxxxxxxxxxx
> Subject: RE: Python fruit basket program with no indentation
>
>
> Wow Jamal that has to be the Ikkiest idea I have ever seen shiver.  Good job
> on showing how it's done though.
>
> Ken
>
> -----Original Message-----
> From: programmingblind-bounce@xxxxxxxxxxxxx
> [mailto:programmingblind-bounce@xxxxxxxxxxxxx] On Behalf Of Jamal Mazrui
> Sent: Tuesday, April 07, 2009 2:17 PM
> To: ProgrammingBlind@xxxxxxxxxxxxx
> Subject: Python fruit basket program with no indentation
>
> >From the archive
> http://EmpowermentZone.com/py_fruit.zip
>
> This fruit basket program is written in Python 2.5, available at
> http://python.org
>
> with wrappers for WxWidgets 2.8, available at
> http://wxPython.org
>
> and an executable builder available at
> http://py2exe.org
>
> This updates the previous archive with an experimental approach that
> completely avoids the Python indentation requirement.  The source code is
> in the file no_indent.py, which may be run in console mode with the Python
> interpreter, using the batch file RunNo_Indent.bat.  That code is also
> used to build the stand-alone, Windows executable no_indent.exe, using the
> batch file RunSetup.bat and script setup.py.
>
> For convenient review by email, a copy of no_indent.py is also pasted
> below.
>
> Jamal
>
> """
> Fruit basket program in Python with no indentation
> Public domain by Jamal Mazrui
> April 7, 2009
>
> The indentation requirement of the Python programming language aids
> its visual readability, but poses perhaps its biggest challenge to
> blind users of speech output.  The challenge is manageable, as
> demonstrated by a number of successful blind programmers.  Techniques
> typically focus on ways of efficiently querying or adjusting
> indentation with speech in order to follow the logical structure of
> code.
>
> This sample program instead uses techniques that avoid the need for
> indentation, itself, by exploiting other features of the language.
> The Python code is valid and functional, though not conventional in
> style.
>
> The first technique defines a function for executing a block of
> statements in an in-line event handler -- also called an 'anonymous
> delegate.'  The multiple lines of code are enclosed in a triple
> quoted string.  At runtime, the custom execute function is called by
> the built-in lambda function, which must be passed an expression
> rather than statement(s).
>
> Within event handling code, parts of a compound statement are put on
> a single line.  In the Add handler, the 'or' keyword is used to
> combine sequential tasks that each return False.  In the Delete
> handler, a semicolon (;) is used, as well as an in-line 'if'
> expression.
>
> The resulting program implements the criteria of a fruit basket
> program in Python without needing any indentation.  Moreover, the
> code is more scripting-like because all variables defined are
> accessible globally, and no explicit class structures are needed.
> The techniques are not necessarily recommended, but they hopefully
> show additional possibilities for overcoming the indentation
> requirement of a popular language.
> """
>
> # Import wxWidgets package
> import wx
>
> # Define function that executes a block of statements
> def execute(sCode): exec sCode
>
> # Initialize program and dialog
> app = wx.PySimpleApp()
> dlg = wx.Dialog(parent=None, title='Fruit Basket')
>
> # Handle Close event
> dlg.Bind(wx.EVT_CLOSE, lambda event: execute("""
> if wx.MessageBox('Exit program?', 'Confirm', wx.YES_NO) == wx.YES:
> dlg.Destroy()
> """))
>
> # Define first row of controls
> lblFruit = wx.StaticText(parent=dlg, label='&Fruit:')
> txtFruit = wx.TextCtrl(parent=dlg)
> btnAdd = wx.Button(parent=dlg, label='&Add')
>
> # Handle Add event
> btnAdd.SetDefault()
> btnAdd.Bind(wx.EVT_BUTTON, lambda event: execute("""
> sFruit = txtFruit.GetValue()
> if len(sFruit ) == 0: wx.MessageBox('No fruit to add!', 'Alert')
> else: lstBasket.Insert(sFruit, 0) or lstBasket.SetSelection(0) or
> txtFruit.Clear()
> """))
>
> # Define second row of controls
> lblBasket = wx.StaticText(parent=dlg, label='&Basket:')
> lstBasket = wx.ListBox(parent=dlg)
> btnDelete = wx.Button(parent=dlg, label='&Delete')
>
> # Handle Delete event
> btnDelete.Bind(wx.EVT_BUTTON, lambda event: execute("""
> iIndex = lstBasket.GetSelection()
> iCount = lstBasket.GetCount()
> if iIndex == -1: wx.MessageBox('No fruit to delete!', 'Alert')
> else: lstBasket.Delete(iIndex); lstBasket.SetSelection(min(iIndex,
> iCount)) if iCount > 1 else None
> """))
>
> # Define layout sizer
> sizer = wx.FlexGridSizer(cols=3, hgap=6, vgap=8)
> for widget in (lblFruit, txtFruit, btnAdd, lblBasket, lstBasket,
> btnDelete): sizer.Add(widget)
> dlg.SetSizerAndFit(sizer)
>
> # Activate dialog and run program
> dlg.Show()
> app.MainLoop()
>
> __________
> View the list's information and change your settings at
> //www.freelists.org/list/programmingblind
>
> __________
> View the list's information and change your settings at
> //www.freelists.org/list/programmingblind
>
__________
View the list's information and change your settings at 
//www.freelists.org/list/programmingblind

Other related posts: