I have amused myself with implementing this and other brevity constructs
useful for working with strings, vectors and other sequences.

In the repl one can now write:

(define-struct person (first-name last-name age height) #:transparent)
(define persons
    (vector (person "John" "Doe" 42 1.80)
                 (person "Jane" "Dae" 43 1.81)))
(define i 1)

(string (@ persons i .first-name 0) (@ persons i .last-name 0))

The file string-lang.rkt  implements a form {...} that allows one
one to reference the i'th element of lists, vectors, strings etc using
the syntax {v i}.

For substrings, sublists and subvectors and subsequences one can write {v i j}.

See the test file for examples.


There is one problem though.

The syntax
  {john .age}  should evaluate as (person-age john)
since john is an instance of a person structure.

Using information from structure-type-info I can construct the
identifier person-age, but I can not figure how to retrieve the
actual accessor without using eval.

This means that {john .age} only works in the repl and not
in a module context.

Any pointers for improving the macro dot (which implements this)
is appreciated.

-- 
Jens Axel Søgaard


2012/5/10 Matthias Felleisen <matth...@ccs.neu.edu>:
>
> Thanks for the nice illustration. It would be
>
> (define initials
>  (string (string-ref (id-firstname (vector-ref person i)) 0)
>          (string-ref (id-lastname (vector-ref person i)) 0)))
>
> but even with that we don't get the density of some path expression:
>
> (define initials (string (@ person i firstname) (@ person i lastname)))
>
> And now we're comparing with
>
> initials = person[i].firstname[0] + person[i].lastname[0]
> or
> initials = (@ person i firstname) + (@ person i lastname)
>
> Hmph.
>
>
>
> On May 10, 2012, at 5:18 PM, Justin Zamora wrote:
>
>> In my experience, the heaviness of Racket doesn't come from words like
>> "define", etc.  It comes in certain categories of programs that deal
>> extensively with strings, vectors, and structured data.  For example,
>>
>> initials = person[i].firstname[0] + person[i].lastname[0]
>>
>> This is very readable and useful.  It can be written quickly and is
>> read and understood easily The overloading of "+" (or your operator of
>> choice) and the implicit coercion of characters to strings is exactly
>> what is wanted here.  Even evaluating person[i] more than once doesn't
>> clutter up the expression.
>>
>> Compare this to the equivalent Racket:
>>
>> (define initials
>>  (string-append (string (string-ref (id-firstname (vector-ref person i)) 0))
>>                 (string (string-ref (id-lastname (vector-ref person i)) 0))))
>>
>> For this sort of thing, the Racket version is much harder to write,
>> read, and verify.  It would be nice to have something akin to
>> at-expressions that would allow such expressions to be written more
>> clearly.
>>
>> Justin
>>
>> On Thu, May 10, 2012 at 4:00 PM, Matthias Felleisen
>> <matth...@ccs.neu.edu> wrote:
>>>
>>> I will assert something about readability:
>>>
>>>  Racket programs look heavy when compared with Haskell programs.
>>>
>>> This is probably true for Python instead of Haskell, too. It is also true 
>>> for ML. I conjecture that part of that heaviness comes from wide lines, 
>>> long names, deep nesting. Who knows. I don't even know how to measure this 
>>> kind of property.
>>>
>>> At this point, I can express certain ideas more easily in Racket than in 
>>> Haskell, Python, ML or whatever, which is why I am fine. But if this 
>>> advantage ever disappeared, heaviness would definitely be a factor to weigh.
>>>
>>> -- Matthias
>>>
>>>
>>>
>>>
>>>
>>>
>>> On May 10, 2012, at 3:49 PM, ozzloy-racket-users wrote:
>>>
>>>> i didn't assert that word length has nothing to do with readability, just 
>>>> that word frequency has more impact on reading time than word length.
>>>>
>>>> On Thu, May 10, 2012 at 3:39 PM, Luke Vilnis <lvil...@gmail.com> wrote:
>>>> I can only speak for myself but I think it's a bit much to assert that 
>>>> word length has nothing to do with readability. Heck, maybe that's even 
>>>> true for you, but not for everyone. I have certainly felt it to be an 
>>>> issue. If the "define" keyword was 50 letters long it would definitely 
>>>> have an impact on my ability to read code - it seems to be an issue of 
>>>> degree, not existence.
>>>>
>>>> On Thu, May 10, 2012 at 3:26 PM, ozzloy-racket-users 
>>>> <ozzloy+users_racket-lang_...@gmail.com> wrote:
>>>> am i the only one that thinks not having abbreviated names for anything is 
>>>> good?
>>>> i like not having "def".  especially if it's going to be redundant.
>>>> i see this as a slippery slope i don't want to go down.
>>>> it annoys me when switching to other languages to have to ask: which way 
>>>> of shortening "function" does this language go with?  was it "fn"? maybe 
>>>> "fun"?
>>>> if the language has a strict policy of not using short versions of words, 
>>>> i don't have to guess.
>>>>
>>>> as for "def" being easier to read than "define", that's not true.  word 
>>>> frequency has more impact on reading time than word length for normal 
>>>> reading.  having more aliases makes both less frequent, so adding "def" 
>>>> could plausibly make reading both take longer.  most people read whole 
>>>> words at a time, rather than letter-by-letter.
>>>>
>>>>
>>>> On Thu, May 10, 2012 at 2:56 PM, Grant Rettke <gret...@acm.org> wrote:
>>>> There is always pretty mode in Emacs.
>>>>
>>>> On Thu, May 10, 2012 at 1:45 PM, Ray Racine <ray.rac...@gmail.com> wrote:
>>>>> FYI for those who may not know.  Racket supports λ as an alias for lambda.
>>>>>  ctrl-\ in DrRacket.
>>>>>
>>>>>
>>>>> On Thu, May 10, 2012 at 1:59 PM, Nikita B. Zuev <nikit...@gmail.com> 
>>>>> wrote:
>>>>>>
>>>>>> +1 for `def' as alias for `define'.
>>>>>> May I also suggest `fun' for `lambda' alias?
>>>>>> Three letter names are the best =)
>>>>>>
>>>>>> (well one can always do it with require rename-in)
>>>>>>
>>>>>> --
>>>>>> Regards,
>>>>>> Nikita B. Zuev
>>>>>> ____________________
>>>>>>  Racket Users list:
>>>>>>  http://lists.racket-lang.org/users
>>>>>
>>>>>
>>>>>
>>>>> ____________________
>>>>>  Racket Users list:
>>>>>  http://lists.racket-lang.org/users
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> http://www.wisdomandwonder.com/
>>>> ACM, AMA, COG, IEEE
>>>>
>>>> ____________________
>>>>  Racket Users list:
>>>>  http://lists.racket-lang.org/users
>>>>
>>>>
>>>> ____________________
>>>>  Racket Users list:
>>>>  http://lists.racket-lang.org/users
>>>>
>>>>
>>>>
>>>> ____________________
>>>>  Racket Users list:
>>>>  http://lists.racket-lang.org/users
>>>
>>>
>>> ____________________
>>>  Racket Users list:
>>>  http://lists.racket-lang.org/users
>
>
> ____________________
>  Racket Users list:
>  http://lists.racket-lang.org/users



-- 
--
Jens Axel Søgaard

Attachment: string-lang.rkt
Description: Binary data

Attachment: test-string-lang.rkt
Description: Binary data

____________________
  Racket Users list:
  http://lists.racket-lang.org/users

Reply via email to