<?xml version="1.0"?><!-- RSS generated by Radio UserLand v8.2.1 on Tue, 03 Feb 2009 20:58:53 GMT --><rss version="2.0">	<channel>		<title>Tom Edelson: Programming languages</title>		<link>http://radio.weblogs.com/0149758/categories/programmingLanguages/</link>		<description>Posts that compare two or more languages, and like that.  You know ... &lt;em&gt;really&lt;/em&gt; geeky stuff.</description>		<copyright>Copyright 2009 Tom Edelson</copyright>		<lastBuildDate>Tue, 03 Feb 2009 20:58:53 GMT</lastBuildDate>		<docs>http://backend.userland.com/rss</docs>		<generator>Radio UserLand v8.2.1</generator>		<managingEditor>edelsont@mac.com</managingEditor>		<webMaster>edelsont@mac.com</webMaster>		<category domain="http://rpc.weblogs.com/shortChanges.xml">rssUpdates</category> 		<skipHours>			<hour>23</hour>			<hour>1</hour>			<hour>2</hour>			<hour>5</hour>			<hour>6</hour>			<hour>7</hour>			<hour>8</hour>			<hour>21</hour>			</skipHours>		<cloud domain="radio.xmlstoragesystem.com" port="80" path="/RPC2" registerProcedure="xmlStorageSystem.rssPleaseNotify" protocol="xml-rpc"/>		<ttl>60</ttl>		<item>			<title>Life Goes On, But (Mostly) Not Here</title>			<link>http://radio.weblogs.com/0149758/categories/programmingLanguages/2009/02/03.html#a62</link>			<description>&lt;br&gt;&lt;p&gt;Once again it&apos;s been quite a while since I posted anything to thisblog.&amp;nbsp; But I haven&apos;t lost the blogging habit altogether: I&apos;vebeen posting things somewhere else.&lt;/p&gt;&lt;p&gt;I was faithful for several years to Radio Userland as my bloggingvenue.&amp;nbsp; (And I will always remember it fondly: it was myfirst.)&amp;nbsp; But the time came when I could no longer resist theallure of a less familiar pretty face, and I have begun a newrelationship ... with &lt;a href=&quot;http://www.livejournal.com/&quot;&gt;LiveJournal&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;In case you&apos;re not familiar with it, LiveJournal is a hybrid: acombination of blogging and social networking.&amp;nbsp; I rather like it(is this New Relationship Energy talking?).&lt;/p&gt;&lt;p&gt;My new blog can be foundhere: &lt;ahref=&quot;http://edelsont.livejournal.com&quot;&gt;&lt;a href=&quot;http://edelsont.livejournal.com&quot;&gt;http://edelsont.livejournal.com&lt;/a&gt;&lt;/a&gt;.&amp;nbsp;You will follow it avidly.&lt;/p&gt;&lt;p&gt;And has this Radio blog been relegated to the dustbin ofhistory?&amp;nbsp; By no means!&amp;nbsp; It&apos;s just become morespecialized.&amp;nbsp; This will be (for the foreseeable future) my &quot;geekblog&quot;.&lt;/p&gt;&lt;p&gt;In other words, what I will plan to post here, from now on, iscomputer technical stuff.&amp;nbsp; Even some postings on software mightgo on LiveJournal, if they are directed at an audience of (potential)users of the software, rather than at the sort of people who program,or otherwise work with computers professionally.&amp;nbsp; So if you&apos;rehard core, stick around!&amp;nbsp; Well, visit me at LJ too, but come backhere when you have the yen to get down into the bits and bytes.&lt;/p&gt;&lt;p&gt;I did create one post &quot;over there&quot; which some might think, by my owncriteria, belonged &quot;over here&quot;.&amp;nbsp; It&apos;s about my programminglanguage preferences (hint: the title is &quot;In Good Taste: VerySchemely&quot;), and you can find itat &lt;ahref=&quot;http://edelsont.livejournal.com/1038.html&quot;&gt;&lt;a href=&quot;http://edelsont.livejournal.com/1038.html&quot;&gt;http://edelsont.livejournal.com/1038.html&lt;/a&gt;&lt;/a&gt;.&amp;nbsp;Take a look, and judge for yourself where it belongs.&amp;nbsp;&lt;/p&gt;&lt;p&gt;I myself would say that that that posting actually is in the rightplace: that it isn&apos;t directed at a technical audience.&amp;nbsp; The onlyreasons it gives for my preferences are non-technical ones.&amp;nbsp; Iwas trying to give the non-geeks a little taste of what it&apos;s like tocare about such things.&lt;/p&gt;&lt;p&gt;I hope that you enjoy the new blog.&amp;nbsp; And that you continue toenjoy this one, too ... if you&apos;re into that sort of thing.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Categorie(s) for this post: &lt;/em&gt; &lt;a href=&quot;http://radio.weblogs.com/0149758/categories/blogging&quot;&gt;Blogging&lt;/a&gt;,&lt;a href=&quot;http://radio.weblogs.com/0149758/categories/radio/&quot;&gt;Radio Userland&lt;/a&gt;,&lt;a href=&quot;http://radio.weblogs.com/0149758/categories/programmingLanguages/&quot;&gt;Programming Languages&lt;/a&gt;.&lt;/p&gt;&lt;br&gt;</description>			<guid>http://radio.weblogs.com/0149758/categories/programmingLanguages/2009/02/03.html#a62</guid>			<pubDate>Tue, 03 Feb 2009 20:45:34 GMT</pubDate>			<comments>http://radiocomments2.userland.com/comments?u=149758&amp;amp;p=62&amp;amp;link=http%3A%2F%2Fradio.weblogs.com%2F0149758%2F2009%2F02%2F03.html%23a62</comments>			</item>		<item>			<title>Comparing JScheme and SISC: Tradeoffs in Programming Language Design (part 4)</title>			<link>http://radio.weblogs.com/0149758/categories/programmingLanguages/2008/04/16.html#a55</link>			<description>&lt;br&gt;&lt;p&gt;As I explained in the previous post, in JScheme, an integer value isalways tagged with a specific type.&amp;nbsp; It might be the default Javainteger type, &lt;code&gt;int&lt;/code&gt;; or it might be one of thealternatives, such as &lt;code&gt;long&lt;/code&gt;.&amp;nbsp; But if it&apos;s an integervalue which will be handled by JScheme&apos;s built-in facilities for same,then its type, as seen by the JScheme interpreter, &lt;em&gt;will&lt;/em&gt; beone of the built-in Java integer types.&lt;/p&gt;&lt;p&gt;Furthermore, each of those built-in Java integer types has a sizelimit, a largest positive [and largest negative] value that can berepresented.&amp;nbsp; A &lt;code&gt;long&lt;/code&gt; takes up 64 bits, as opposed to32 bits for an &lt;code&gt;int&lt;/code&gt;, and so the maximum positive value fora &lt;code&gt;long&lt;/code&gt; is 2&lt;sup&gt;63&lt;/sup&gt;-1, as opposed to2&lt;sup&gt;31&lt;/sup&gt;-1.&amp;nbsp; But there is always a limit; and as a result,there is always the possibility that a seemingly simple calculationmay produce a wrong answer, in JScheme as in Java.&lt;/p&gt;&lt;p&gt;In SISC, on the other hand, an integer is, so far as is visible to theSISC programmer, simply an integer.&amp;nbsp; The SISC interpreter doessome work behind the scenes to keep track of the amount of memory thatmust be reserved for the value, since that is variable, with nopredefined limit.&amp;nbsp; But integers of different sizes are notconsidered to be of different types.&lt;/p&gt;&lt;p&gt;As a result of this design difference, SISC cannot produce the sortof wrong answers to which I referred above, those due to &quot;integeroverflow&quot;.&amp;nbsp; The memory space occupied by the result is as big asit needs to be in order to accomodate the mathematically correctanswer.&lt;/p&gt;&lt;p&gt;This can be viewed as an advantage of SISC over JScheme, and also overJava ... and over most other programming languages, for that matter.&lt;/p&gt;&lt;p&gt;Furthermore, in respect to both the original design difference, andthe difference in mathematical correctness that results from it, SISCis conforming to the R5RS Scheme standard, and JScheme is not.&amp;nbsp;&lt;/p&gt;&lt;p&gt;That&apos;a all a recap of what I&apos;ve said before.&amp;nbsp; The new businessfor the present post is to explain why I say that this advantage forSISC &lt;em&gt;necessarily&lt;/em&gt; comes with a disadvantage, when it comes tocalling a Java method (&quot;method&quot; being, pretty much, Java&apos;s name forwhat might otherwise be called a routine, procedure, or function) ...specifically, when passing integer parameters from Scheme code to theJava method.&lt;/p&gt;&lt;p&gt;As background to this, one must know and remember certain facts aboutJava methods themselves.&amp;nbsp; The first of these is that when youcreate a Java method, you explicitly declare a type for each of itsparameters; and in order to call the method, you must supply a list ofparameters (or, more strictly speaking, &quot;arguments&quot;) whose types matchthe types in the declared parameter list exactly.&amp;nbsp; For example,if the method&apos;s definition says that there must be two arguments, thefirst an &lt;code&gt;int&lt;/code&gt; and the second a &lt;code&gt;String&lt;/code&gt;, youcannot call it with a &lt;code&gt;long&lt;/code&gt; and a &lt;code&gt;String&lt;/code&gt;,instead.&lt;/p&gt;&lt;p&gt;The second fact is that a Java class, or source file, can contain two(or more) methods with the same name.&amp;nbsp; You can have one whichexpects an &lt;code&gt;int&lt;/code&gt; and a &lt;code&gt;String&lt;/code&gt;, and another,with the same name, which expects a &lt;code&gt;long&lt;/code&gt; anda &lt;code&gt;String&lt;/code&gt;.&amp;nbsp; Their implementations will [necessarily]be different as well, but the difference in parameter types is theonly difference which the underlying language software can use inorder to figure out which of the two methods will be called.&amp;nbsp; (Wewould say, of these two example methods, that the type declared forthe first parameter is the only difference in their&quot;signatures&quot;.&amp;nbsp; That&apos;s because &quot;signature&quot;, for a method, iseffectively defined to mean: that collection of facts about it whichare relevant to determining whether or not it should be called (or&quot;invoked&quot;) in any given situation.)&lt;/p&gt;&lt;p&gt;(When the calling code is written in Java as well, this determinationcan be made at compile time.&amp;nbsp; When the calling code is Scheme(JScheme &lt;em&gt;or&lt;/em&gt; SISC), this can, in general, only be determinedat run time.&amp;nbsp; This difference between the languages, whileimportant in other contexts, is not very relevant to the particulardifference between JScheme and SISC which is our topic today.)&lt;/p&gt;&lt;p&gt;(I will also mention that this particular fact about Java, the factthat you can have two methods with the same name, and thus distinguishable onlyby their parameter lists, is one of my least favorite things aboutJava.&amp;nbsp; It is undoubtedly considered a good thing by many whoprogram primarily in Java itself; but for those interested in callingJava from a &quot;dynamic&quot; language like Scheme, it is the source of muchpain, largely because of just the sort of consequences of it that areunder discussion here.&amp;nbsp; However, I generally try not to fuss muchabout what I do or don&apos;t like about Java; Java is just &lt;em&gt;there,&lt;/em&gt;y&apos;know?)&lt;/p&gt;&lt;p&gt;So anyway, now we can look at the consequences of these facts aboutJava, as they affect calling Java from JScheme; and contrast that withhow they affect calling Java from SISC.&lt;/p&gt;&lt;p&gt;From JScheme, this is relatively straightforward.&amp;nbsp; I&apos;ll continueto use the example in which there are two candidate methods, havingthe same name, with the only difference in their signatures being thatthe first method requires an &lt;code&gt;int&lt;/code&gt; in the first argumentposition, while the second method requires a &lt;code&gt;long&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;When the JScheme interpreter encounters a method call in which thegiven method name, and other context, point at a choice between thesetwo candidate methods, it decides between them by examining theinternal tags which indicate the types of the arguments beingsupplied.&amp;nbsp; If the arguments are tagged as an an &lt;code&gt;int&lt;/code&gt;and a &lt;code&gt;String&lt;/code&gt;, the first method will be invoked.&amp;nbsp; Ifthey are tagged as a &lt;code&gt;long&lt;/code&gt; and a &lt;code&gt;String&lt;/code&gt;, thesecond method will be invoked.&amp;nbsp; If anything else, a run-time errorwill be signaled.&lt;/p&gt;&lt;p&gt;Now consider the same situation, except that SISC, not JScheme, is theScheme implementation being used.&amp;nbsp; In SISC, just as in JScheme(or any Scheme implementation), the values are tagged, internally,with some indication of the &quot;type&quot; of each.&amp;nbsp; But in SISC, as Isaid above, an integer is just an integer ... meaning that it istagged only as such, not as one of the various specific Java integertypes such as &lt;code&gt;int&lt;/code&gt; or &lt;code&gt;long&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;Let me make clear that in SISC, you &lt;em&gt;can&lt;/em&gt; have a value taggedas a Java &lt;code&gt;int&lt;/code&gt; or as a Java &lt;code&gt;long&lt;/code&gt;.&amp;nbsp;Indeed, one needs to make use of this capability in order to resolvethe difficulty under discussion.&amp;nbsp; But a value tagged in either ofthese ways is not considered to be an &quot;integer&quot; by SISC: it doesn&apos;tlet you use either of them in its native arithmetic operations.&amp;nbsp;There&apos;s really not much you can do with them, other than to pass themto Java methods, or to convert them to actual Scheme integers.&lt;/p&gt;&lt;p&gt;But to return to the situation at hand: the SISC program wants to callone of these two candidate methods.&amp;nbsp; It supplies an argument listin which the first parameter is tagged internally simply as a Schemeinteger, not as a Java &lt;code&gt;int&lt;/code&gt; or &lt;code&gt;long&lt;/code&gt;.&amp;nbsp;But only by treating this argument as an &lt;code&gt;int&lt;/code&gt;, or asa &lt;code&gt;long&lt;/code&gt;, can the SISC interpreter legitimately determinewhich method to call.&amp;nbsp; So how can it make this decision?&lt;/p&gt;&lt;p&gt;The answer is that it can&apos;t.&amp;nbsp; If the SISC program attempts this,an error will be signalled.&amp;nbsp; Since there&apos;s no way for the SISCinterpreter to make the decision, the person writing the SISC programmust make it.&amp;nbsp; SISC must, and does, require that the SISC codefirst explicitly convert this Scheme integer value into either aJava &lt;code&gt;int&lt;/code&gt; or a Java &lt;code&gt;long&lt;/code&gt;, before attemptingto pass it to one of these methods.&amp;nbsp; And [obviously?], the typeto which it is converted determines which method is invoked.&lt;/p&gt;&lt;p&gt;The conversion is not, technically, part of the method call, but it isa prerequisite to it ... if you want to call one of these methods, andthe value you want to pass as the first argument is [for example] theresult of an arithmetic calculation done in the Scheme code.&lt;/p&gt;&lt;p&gt;Having to do an explicit conversion means having to write additionalcode; but we&apos;re not talking about &lt;em&gt;a lot&lt;/em&gt; of additional codehere.&amp;nbsp; Let me [finally!] show you what the code would actuallylook like.&amp;nbsp; In so doing, I&apos;ll simplify the example: now our twocandidate methods each requires &lt;em&gt;one&lt;/em&gt; argument, the firstmethod requiring it to be an &lt;code&gt;int&lt;/code&gt;, and the seconda &lt;code&gt;long&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;The conversion, together with the method call, could looklike this in SISC:&lt;/p&gt;&lt;pre&gt;  (my-method (-&amp;gt;jint scheme-value))  &lt;/pre&gt;&lt;p&gt;in order to call the first method, or&lt;/p&gt;&lt;pre&gt;  (my-method (-&amp;gt;jlong scheme-value))  &lt;/pre&gt;&lt;p&gt;in order to call the second.&amp;nbsp; Whereas in JScheme, it could looksimply like this:&lt;/p&gt;&lt;pre&gt;  (my-method scheme-value)  &lt;/pre&gt;&lt;p&gt;(Of course, in either implementation, it couldn&apos;tlook &lt;em&gt;exactly&lt;/em&gt; like what I&apos;ve shown ... unless you had firstdefined the symbol &lt;code&gt;my-method&lt;/code&gt; so that its value is theappropriate &quot;generic Java method&quot;.&amp;nbsp; That prior step would lookdifferent in SISC from how it would look in JScheme; I&apos;m assuming thatit&apos;s already been made, in order to abstract away this syntacticdifference, and focus on the difference concerning the data typeconversion, or lack of same, in SISC or JScheme, respectively.&lt;/p&gt;&lt;p&gt;In fact, what I am doing here is the opposite of what I didin &lt;a      href=&quot;http://radio.weblogs.com/0149758/2008/03/19.html#a53&quot;&gt;part    2&lt;/a&gt;.&amp;nbsp; There, my original SISC example was&lt;/p&gt;&lt;pre&gt;  (define later    (-&amp;gt;boolean ((generic-java-method &apos;after) date2 date1)))  &lt;/pre&gt;&lt;p&gt;in which the &quot;&lt;code&gt;-&amp;gt;boolean&lt;/code&gt;&quot;, plus one set of parentheses,represented one of these type conversions which SISC requires, andJScheme does not.&amp;nbsp; Then I waved my hand at the type conversion,promising to explain it later (&quot;planning to come back, in a subsequentpost, to the issues around it&quot;), and then abstracted it out, in orderto focus on the syntactic difference.&amp;nbsp; The &quot;subsequent post&quot; inquestion is the one you are reading now.)&lt;/p&gt;&lt;p&gt;I will claim that I have now shown you a very good example of anecessary tradeoff in language design.&amp;nbsp; I stress that it is inlanguage &lt;em&gt;design,&lt;/em&gt; not language &lt;em&gt;choice:&lt;/em&gt; it&apos;s not aquestion of having to accept the whole package of choices that one oranother language designer made, with it being [merely] statisticallyclose-to-impossible that either designer will have made each choiceexactly as you would wish.&lt;/p&gt;&lt;p&gt;The tradeoff here could be described, either from the [presumed]perspective of the JScheme designers/implementors, or from theperspective of those creating SISC.&lt;/p&gt;&lt;p&gt;For the people designing JScheme, it seems clear that a top prioritywas given to making calls from JScheme to Java as easy ... andsuccinct ... as possible.&amp;nbsp; That means you can&apos;t require explicittype conversions, for those are additional code.&amp;nbsp; The only way tomake the calls, unambiguously, without requiring explicit typeconversions (in at least some cases) is to have the JScheme typescorrespond one-to-one with Java types.&amp;nbsp; Each of the built-ininteger types in Java has a predefined size limit; so the same must betrue of each one in JScheme.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Finally, if there is a finite set of integer data types, each with apredefined size limit, then there must be some cases in which you cancode an arithmetic operation, and give it input values, each of whichfits within the range of values that can be represented; but theactual correct result of the arithmetic operation, as that operationis understood outside &quot;computer arithmetic&quot;, is outside the range ofvalues that can be represented.&amp;nbsp; Since the correct answer cannotbe represented, JScheme cannot give you that correct answer as theresult of the operation.&lt;/p&gt;&lt;p&gt;The people designing SISC, on the other hand, seem to have had afundamental design goal of fully implementing the R5RS Schemespecification.&amp;nbsp; The specification requires that an implementationnot give incorrect arithmetic results, at least not of the sort thatare entailed by fixed limitations on the range of representablevalues.&amp;nbsp; Therefore SISC, or any other fully conforming Schemeimplementation, cannot have such predefined limits on the range ofvalues.&lt;/p&gt;&lt;p&gt;But the built-in Java integer types all do have such predefinedlimits.&amp;nbsp; Therefore the SISC types cannot correspond one-to-onewith the Java types.&amp;nbsp; Therefore (and given the fact that two Javamethods can have the same name, and be distinguishable only by thetypes in their parameter lists), if you were allowed simply to passvalues of Scheme types as arguments to Java methods, there wouldnecessarily be cases in which the interpreter could not determinewhich method to invoke.&amp;nbsp; Therefore SISC must require explicittype conversions, in at least some cases, in order to eliminate theseambiguities.&lt;/p&gt;&lt;p&gt;In short, sometimes you can&apos;t have it both ways.&lt;/p&gt;&lt;em&gt;Categorie(s) for this post: &lt;/em&gt; &lt;a href=&quot;http://radio.weblogs.com/0149758/categories/Scheme&quot;&gt; Scheme&lt;/a&gt;.&lt;/p&gt;&lt;br&gt;</description>			<guid>http://radio.weblogs.com/0149758/categories/programmingLanguages/2008/04/16.html#a55</guid>			<pubDate>Wed, 16 Apr 2008 20:42:59 GMT</pubDate>			<comments>http://radiocomments2.userland.com/comments?u=149758&amp;amp;p=55&amp;amp;link=http%3A%2F%2Fradio.weblogs.com%2F0149758%2F2008%2F04%2F16.html%23a55</comments>			</item>		<item>			<title>More on Moneydance Extensions</title>			<link>http://radio.weblogs.com/0149758/categories/programmingLanguages/2007/04/23.html#a36</link>			<description>&lt;br&gt;&lt;p&gt;One of the ten Moneydance extensions currently available is called the&quot;Python Scripting Interface&quot;.&amp;nbsp; I don&apos;t know Python, so I haven&apos;tdownloaded that extension.&amp;nbsp; I more-or-less assume, though, that if youinstall it, you then have access, from Python code, to thefull Moneydance API: can then do anything from a Python script that you coulddo directly from a full-fledged extension, written in Java.&lt;/p&gt;&lt;p&gt;And, I&apos;d further assume, you could do it with less effort than wouldbe involved in writing an extension: some of the overhead, setting upyour access to Moneydance data, would already have been done foryou.&amp;nbsp; Thus, I&apos;d expect that if you wanted to automate someMoneydance chore for your own use, and weren&apos;t thinking ofdistributing the code you create to others, then it would be easier todo it in Python than in Java.&lt;/p&gt;&lt;p&gt;Provided, of course, that you knew Python.&amp;nbsp; As I mentioned, Idon&apos;t ... and it really doesn&apos;t have a place on any list of languagesI want to learn, either.&amp;nbsp; (Before a horde of Python fanaticsdescends upon me, let me hasten to add that I really havenothing &lt;em&gt;against&lt;/em&gt; Python; it&apos;s just that there arevarious other languages which, for one reason or another, excite me more... enough of them for one lifetime, I think.&amp;nbsp; I don&apos;t claim thatthis preference is anything but arbitrary, OK?)&lt;/p&gt;&lt;p&gt;If you have some other scripting language that you&apos;d like to be ableto use with Moneydance (&lt;em&gt;at least&lt;/em&gt;, if it&apos;s a scripting  languagethat&apos;s been implemented in Java), you can write your own &quot;scriptinginterface&quot; in the form of a new extension, and grant your ownwish.&amp;nbsp; (Uh, that&apos;s provided that you also know some Java, ofcourse.)&lt;/p&gt;&lt;p&gt;As a matter of fact, that&apos;s exactly what I have in mind: to write aMoneydance &quot;scripting interface&quot; for one of the Java implementationsof Scheme ... of which, you may or may not be surprised to know, thereare at least three.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Categorie(s) for this post: &lt;/em&gt; &lt;a href=&quot;http://radio.weblogs.com/0149758/categories/personalFinanceSoftware&quot;&gt;Personal Finance Software&lt;/a&gt;; &lt;a href=&quot;http://radio.weblogs.com/0149758/categories/Scheme&quot;&gt; Scheme.&lt;/p&gt;&lt;br&gt;</description>			<guid>http://radio.weblogs.com/0149758/categories/programmingLanguages/2007/04/23.html#a36</guid>			<pubDate>Mon, 23 Apr 2007 21:25:36 GMT</pubDate>			<comments>http://radiocomments2.userland.com/comments?u=149758&amp;amp;p=36&amp;amp;link=http%3A%2F%2Fradio.weblogs.com%2F0149758%2F2007%2F04%2F23.html%23a36</comments>			</item>		<item>			<title>I&apos;m a Mac person</title>			<link>http://radio.weblogs.com/0149758/categories/programmingLanguages/2006/09/02.html#a19</link>			<description>&lt;br&gt;&lt;p&gt;My &lt;a href=&quot;http://radio.weblogs.com/0149758/2006/08/26.html&quot;&gt; last  post&lt;/a&gt; cited Scheme, Perl, and Java as my &quot;favorite&quot; programming  languages.&amp;nbsp; I anticipate that I may, in time, add Objective-C  to that list.&amp;nbsp; Some readers will know that such an expectation  suggests a Macintosh connection.&amp;nbsp; (And/or   &lt;a href=&quot;http://www.gnustep.org/&quot;&gt;GnuStep&lt;/a&gt;.)&lt;/p&gt;&lt;p&gt;It&apos;s true.&amp;nbsp; I&apos;m a Mac user (almost exclusively, lately), and amoderate enthusiast, though I&apos;m not in love with Apple as acompany.&amp;nbsp; I&apos;m primarily interested in software to be used byindividuals, or &lt;em&gt;very small&lt;/em&gt; organizations, and the Mac seemsto me to be the platform of choice for that sort of application.&lt;/p&gt;&lt;p&gt;Your mileage may vary, but that&apos;s how I see it.&lt;/p&gt;&lt;em&gt;Categorie(s) for this post include: &lt;/em&gt; &lt;a href=&quot;http://radio.weblogs.com/0149758/categories/macintosh&quot;&gt;Macintosh&lt;/a&gt;.&lt;/p&gt;&lt;br&gt;</description>			<guid>http://radio.weblogs.com/0149758/categories/programmingLanguages/2006/09/02.html#a19</guid>			<pubDate>Sat, 02 Sep 2006 21:30:33 GMT</pubDate>			<comments>http://radiocomments2.userland.com/comments?u=149758&amp;amp;p=19&amp;amp;link=http%3A%2F%2Fradio.weblogs.com%2F0149758%2F2006%2F09%2F02.html%23a19</comments>			</item>		<item>			<title>What I do</title>			<link>http://radio.weblogs.com/0149758/categories/programmingLanguages/2006/08/26.html#a18</link>			<description>&lt;br&gt;&lt;p&gt;So what am I doing with myself, since I &lt;a href=&quot;http://radio.weblogs.com/0149758/2006/08/24.html&quot;&gt;&quot;retired&quot;&lt;/a&gt;?&lt;/p&gt;  &lt;p&gt;I consider myself to have two &quot;callings&quot;: software developer, and writer.&lt;/p&gt;&lt;p&gt;Let me talk about the former for a bit, now.&lt;/p&gt;At the moment, at least, I&apos;d say that my three favorite programming languages are Perl, Scheme, and Java. &amp;nbsp; (I wonder how many people there are who would pick those three.  I suspect -- but not  confidently -- that the answer would be &quot;not many&quot;, because they&apos;re all so different from each other. )&lt;br&gt;&lt;br&gt;Perl is the language I&apos;ve worked  in the most, over the last several years (which is to say, over the greater part of my time at SAS).&amp;nbsp; &lt;br&gt;&lt;br&gt; At any rate.&amp;nbsp; My &quot;focal project&quot; at the moment is implementing a flexible backup utility as a Perl module.&amp;nbsp; &quot;As a Perl module&quot; implies that this is not a standalone application designed for complete non-programmers to use: you have to write a Perl script in order to make use of it.&amp;nbsp; But for those who know how to do that, it gives them a great deal of control over how the backups are done.&amp;nbsp; &lt;br&gt;&lt;br&gt;I&apos;m writing this mostly because I want it.&amp;nbsp; But I do intend, also, to submit it to CPAN (the Comprehensive Perl Archive Network), once it&apos;s done.&lt;br&gt;&lt;p&gt;&lt;em&gt;Categorie(s) for this post include: &lt;/em&gt; &lt;a href=&quot;http://radio.weblogs.com/0149758/categories/retirement&quot;&gt;Retirement&lt;/a&gt;; &lt;a href=&quot;http://radio.weblogs.com/0149758/categories/perl&quot;&gt;Perl&lt;/a&gt;; &lt;a href=&quot;http://radio.weblogs.com/0149758/categories/backupSoftware&quot;&gt;Backup software&lt;/a&gt;.&lt;/p&gt;</description>			<guid>http://radio.weblogs.com/0149758/categories/programmingLanguages/2006/08/26.html#a18</guid>			<pubDate>Sat, 26 Aug 2006 19:00:26 GMT</pubDate>			<comments>http://radiocomments2.userland.com/comments?u=149758&amp;amp;p=18&amp;amp;link=http%3A%2F%2Fradio.weblogs.com%2F0149758%2F2006%2F08%2F26.html%23a18</comments>			</item>		</channel>	</rss>