help-smalltalk
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Help-smalltalk] Re: C API explanation


From: Paolo Bonzini
Subject: [Help-smalltalk] Re: C API explanation
Date: Tue, 30 Sep 2008 06:56:57 +0200
User-agent: Thunderbird 2.0.0.17 (Macintosh/20080914)

> I've been trying to understand this segment of code:-
> 
>             vals := ldap getValues: entry attribute: attr.
>             vals isNull ifFalse: [
>                     val := vals.
>                     [ val value isNil ] whileFalse: [
>                             (attr->val value) printNl.
>                             val incr ].
>             ]
> 
> When I look at the orginal C source, vals is just an array of strings
> and it just requires a simple _for_ loop to print out all the values.
> One wonders why the Smalltalk code is so verbose.

Because Smalltalk has no for(A=B;*A;A++) statement:

  val := vals "A=B"
  [val value isNil ] "*A != NULL" whileFalse: [
     ...
     val incr "A++"
  ]

>     val := vals.
>     " why the need to copy val to another variable? Is this just in case
> we decide to update vals?"

To free vals later.

>     [ val value isNil ] whileFalse: [
>     "So what does 'val value' represent? A pointer to an array?"

"val" is A, "val value" is "*A" i.e. the string.

>     (attr->val value) printNl.
>     "'attr->val value'. This is the one I really don't understand. Why
> doesn't the array of strings come into Smalltalk as just that; an array
> of strings, then all one has to to is step through the array? Instead
> we're getting the value from an association..?"

No, that's wrong!  I'm just replacing

  printf ("%s %s\n", attr, *val);

with printing an association.  It's less verbose than

  ('%1 %2' % { attr. val value }) printNl.

but maybe the latter is clearer.

Paolo




reply via email to

[Prev in Thread] Current Thread [Next in Thread]