[Openmcl-devel] Objective-CL
Alexander Repenning
ralex at cs.colorado.edu
Thu Dec 23 11:27:08 PST 2010
I guess I would like to hear more about why adding an Objective-C like syntax to Lisp is a good thing. No flame war please, I am not saying that there could be no good reason but I am not quite sold. As many of you know Lisp itself is not generally considered a great programming language from a syntactic point of view due to parenthesis paranoia. However, if I would be asked to point to one programming language disliked by todays students even more it actually would be Objective-C. BUT, the students do use Objective-C + Cocoa because they can make cool iOS apps, e.g., games they can actually make money with, IN SPITE of the Objective-C syntax not thanks to it.
Alex
On Dec 22, 2010, at 8:28 AM, Pascal J. Bourguignon wrote:
> Hello,
>
> I've been writing a couple of reader macro to implement an
> Objective-C like syntax for Common Lisp, above the ccl Objective-C
> bridge.
>
> I still have finalize the processing of type specifiers (I need to learn
> more about ccl FFI types), however here is already the documentation
> source.
>
> You may find a snapshot tarball at
> ftp://ftp.informatimago.com/users/pjb/lisp/objcl.tar.bz2
> with the sources and the PDF of the documentation.
>
>
> Eventually, it would be nice if this was distributed with ccl, as a
> contribution (for now it's under GPL2, but I would provide any required
> license for integration with ccl).
>
> I'd gladly read any comment about it.
>
> ------------------------------------------------------------------------
> .. comment: -*- mode:rst; coding:utf-8; -*-
>
> Objective-CL
> ############
>
> Objective-C like syntax for Common Lisp
> =======================================
>
> Bugs
> ----
>
> The ``type-specifiers`` are not defined yet. I need to learn about
> ``ccl`` FFI and perhaps add a syntax, or at least improve the reading
> of ``type-specifiers``. Notably, for now they're merely read in the
> keyword package so we cannot give type specifiers such as: (NSRect) or
> (NSWindow*).
>
>
> Motivation
> ----------
>
> The purpose of this package is to provide a few reader macros
> implementing a syntax like Objective-C to program with Objective-C FFI
> such as the ``ccl`` Objective-C bridge.
>
> The principles of the Objective-C syntax is that it is a small set of
> extensions over the syntax of the base language (C in the case of
> Objective-C). Namely:
>
> - message sending expressions are put inside brackets (inspired from
> Smalltalk block notation), and have basically the Smalltalk message
> sending syntax.
>
> - class declarations and definitions (interface and implementation)
> and other Objective-C specific elements use keywords prefixed by the
> #\\@ character.
>
>
> The later is a little at odd with lisp nature, where every form is an
> expression, and where parenthesized syntax is prefered. We will
> therefore provide a more Smalltalk-like way to define classes and
> methods (while retaining the #\\@ character as prefix for some
> symbols, and as a reader macro to read Objective-C string literals).
>
>
> Principles
> ----------
>
> Two reader macros are provided:
>
> - a reader macro bound to #\\[ is used to parse message sending
> expressions, just like in Objective-C, but since the underlying
> language is lisp, sub-expressions starting with parentheses are read
> just like normal sexps (they may further contain Objective-CL syntax).
>
> - a reader macro bound to #\\@ which is used to read:
>
> - an Objective-C literal strings when followed by a double-quote
> starting a lisp string.
>
> - a class or method definition expression, when followed by an
> opening bracket #\\[. The syntax used for these definition
> expression is similar to the message sending syntax, but it's
> processed more like a special operator or macro than a real
> message sending: the sub-expression are evaluated with different
> rules that depend on the operation. It's called a pseudo-message.
>
> - a normal lisp symbol otherwise.
>
> ¶
>
> These reader macros expand to normal lisp forms, using symbols
> exported from a portability layer package, nicknamed OCLO, which
> should be implemented specifically for each Objective-C bridge or FFI.
> The implementation of this bridge is out of scope of these syntax-
> providing reader macros.
>
>
> Message Sending
> ---------------
>
> The syntax is: ::
>
> objcl-message-expr := '[' message-send ']' .
>
> message-send := recipient message .
> recipient := sexp | class-name | 'super' | 'self' .
> class-name := objcl-identifier .
>
> message := simple-selector | compound-selector final-arguments .
>
> simple-selector := objcl-identifier .
> compound-selector := objcl-identifier ':' sexp compound-selector
> | objcl-identifier ':' sexp .
> final-arguments := | '(' type-identifier ')' sexp final-arguments .
> type-identifier := symbol .
>
>
> -- FIXME type-identifier; perhaps we need:
> -- type-identifier := symbol | symbol sexp .
> -- for example: (char *)cString (array (int 10))tenInts ?
> -- Check with what is available at the FFI/bridge level.
>
>
> An ``objcl-identifier`` is a case sensitive identifier that is converted
> to a lisp symbol according to the rules of Objective-C to Common Lisp
> identifier translation.
>
> A ``sexp`` is a normal lisp expression, which might be another message
> sending bracketed expression (or another Objective-CL form).
>
> There should be no space between the ``objcl-identifier`` and the colon.
> After the first ``objcl-identifier`` in a compound-selector, the
> remaining ``objcl-identifiers`` can be absent, in which case the colon
> must be separated from the previous expression by a space.
>
>
> When recipient is ``super``, an ``(oclo:send-super self ...)`` form is returned.
> FIXME document the other forms returned.
>
> Examples: ::
>
> [self update]
>
> [window orderFront:sender]
>
> [array performSelector:(@selector "drawRect:") withObject:rect]
>
> (let ((o [[NSObject alloc] init]))
> [NSArray arrayWithObjects:o (id)o (id)o (id)nil])
>
>
> '[array performSelector:(@selector "drawRect:") withObject:rect]
> → (OBJC:SEND ARRAY :PERFORM-SELECTOR (@SELECTOR "drawRect:") :WITH-OBJECT RECT)
>
> Class definition
> ----------------
>
> Classes are created by sending a ``subClass:slots:`` pseudo-message to its superclass.
>
> The syntax is : ::
>
> objcl-definition := '@[' class-definition | instance-method-definition | class-method-definition ']' .
>
> class-definition := super-class-name 'subClass:' class-name 'slots:' '(' slots ')' .
>
> class-name := objcl-identifier .
> super-class-name := objcl-identifier .
> slots := | slot slots .
> slot := lisp-slot | objcl-slot .
> lisp-slot := slot-specifier . -- see clhs defclass.
>
>
> -- objcl-slot := ... -- not defined yet.
> -- We'd want some simplified definition, and using Obj-C names.
>
>
> Examples: ::
>
> @[NSObject subClass:SpaceShip
> slots:((position :accessor ship-position :initform (make-position))
> (speed :accessor ship-speed :initform 0.0))]
>
>
> Method definition
> -----------------
>
> Class and instance methods are defined by sending a pseudo-message to
> the class, either ``method:resultType:body:`` to create an instance
> method, or ``classMethod:resultType:body:`` to create a class method.
>
>
> The syntax is : ::
>
> objcl-definition := '@[' class-definition | instance-method-definition | class-method-definition ']' .
>
> instance-method-definition := class-name 'method:' '(' signature ')'
> 'resultType:' '(' type-identifier ')'
> 'body:' body .
>
> class-method-definition := class-name 'classMethod:' '(' signature ')'
> 'resultType:' '(' type-identifier ')'
> 'body:' body .
>
> class-name := objcl-identifier .
> signature := simple-signature | compound-signature final-signature .
> simple-signature := objcl-identifier .
> compound-signature := objcl-identifier ':' '(' type-identifier ')' objcl-identifier compound-signature
> | objcl-identifier ':' '(' type-identifier ')' objcl-identifier .
> final-signature := '&rest' objcl-identifier .
> body := | sexp body .
>
> -- FIXME type-identifier; perhaps we need:
> -- type-identifier := symbol | symbol sexp .
> -- for example: (char *)cString (array (int 10))tenInts ?
> -- Check with what is available at the FFI/bridge level.
>
> There should be no space between the ``objcl-identifier`` and the colon.
> After the first ``objcl-identifier`` in a compound-selector, the
> remaining ``objcl-identifiers`` can be absent, in which case the colon
> must be separated from the previous expression by a space.
>
> Examples: ::
>
> @[SpaceShip classMethod:(shipAtPosition:(Position)aPosition)
> resultType:(id)
> body:(let ((new-ship [[self alloc] init]))
> [new-ship setPosition:aPosition]
> new-ship)]
>
> @[SpaceShip method:(moveToward:(Direction)aDirection atSpeed:(double)velocity)
> resultType:(id)
> body:(let ((new-pos [[self position] offset:...]))
> (do-something new-pos)
> [self setPosition:new-pos])]
>
> String literals
> ---------------
>
> The syntax read is: ::
>
> objcl-string-literal := '@"' { character } '"' .
>
> A CL string is read (ie. with the same escaping rules as normal CL
> strings), and an (oclo:@ "string") form is returned.
>
> Examples: ::
>
> @"Untitled"
> @"String with \"quotes\" and \\ backslash."
> @"String with
> new lines"
>
>
>
>
>
> --
> __Pascal Bourguignon__ http://www.informatimago.com/
> A bad day in () is better than a good day in {}.
>
> _______________________________________________
> Openmcl-devel mailing list
> Openmcl-devel at clozure.com
> http://clozure.com/mailman/listinfo/openmcl-devel
Prof. Alexander Repenning
University of Colorado
Computer Science Department
Boulder, CO 80309-430
vCard: http://www.cs.colorado.edu/~ralex/AlexanderRepenning.vcf
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.clozure.com/pipermail/openmcl-devel/attachments/20101223/2516e92c/attachment.htm>
More information about the Openmcl-devel
mailing list