[cfe-dev] blocks and lambdas
Bruno Santos
bsantos at av.it.pt
Thu Feb 10 06:56:28 PST 2011
Qua, 2011-02-09 às 15:48 -0800, James Gregurich escreveu:
>
> On Feb 9, 2011, at 2:00 AM, David Chisnall wrote:
>
> >
> > Lambdas and blocks are orthogonal technologies.
>
>
> How are they orthogonal? I see a ton of overlap between the two....at
> least conceptually.
>
>
>
>
>
> > Blocks are a C extension designed to interoperate nicely with
> > Objective-C and to work with C++. Lambdas are a (very different) C
> > ++ technology. Saying that you want a C library (libdispatch) to
> > support a C++ technology (lambdas) doesn't make much sense.
>
>
>
>
> Why is the following structure incapable of describing a C++ lambda
> function?
>
>
> struct Block_basic {
> void *isa;
> int Block_flags; /* int32_t */
> int Block_size; /* XXX should be packed into Block_flags */
> void (*Block_invoke)(void *);
> void (*Block_copy)(void *dst, void *src); /* iff
> BLOCK_HAS_COPY_DISPOSE */
> void (*Block_dispose)(void *); /* iff
> BLOCK_HAS_COPY_DISPOSE */
> /* long params[0]; // where const imports, __block storage
> references, etc. get laid down */
> };
>
It can't, a lambda can be used as a function pointer!
Lambdas are syntactic sugar for function objects, which is fundamentally
different from what blocks are. What you are asking is lot of baggage
for nothing, from a pure C++ perspective, just to be compatible with
blocks.
>
>
>
> If the clang C compiler can set up this structure for a Blocks block,
> I don't see why the clang C++ compiler cannot do the analogous
> operation with a C++ lambda.
>
>
>
>
> whether it is C or C++, it's all just symbols and structures.
>
>
>
>
>
>
>
> > Given the different semantics between blocks and lambdas,
> > implementing one in terms of the other does not really make sense.
> > However, it would be fairly simple at the library level to
> > implement a wrapper for one in terms of the other, so this isn't a
> > compiler issue, it's an issue for your code.
> >
>
>
>
>
> Why do the semantics of the languages matter? They are conceptually
> the same thing. The only difference I see is the __blocks keyword/
> block storage. My point earlier is don't worry about block storage for
> lambdas. C++ programmers are expected to understand the lifetimes of
> their variables and not use them in ways inconsistent with their
> scope....also, if one wants to share variables with the stack and
> multiple blocks, he'll declare the variable as a shared_ptr anyway.
> The block/lambda just needs to copy the shared_ptr by value.
>
>
>
>
>
>
> > Having blocks and labmdas share an implementation in clang would be
> > problematic for a variety of reasons. For one thing, blocks already
> > have a well-defined ABI, and lambdas will have a per-platform ABI.
> > Unless you could persuade the C++ committee to break with tradition
> > and specify an ABI, and specify that ABI to be compatible with the
> > existing, deployed, blocks ABI, then this is not feasible.
> >
>
>
>
> The behavior can be specific to MacOSX where Apple controls the
> platform and ABI. I doubt there is extensive blocks use outside of the
> Apple universe. So, interoperability doesn't matter outside the Apple
> universe. Apple doesn't support newer versions of gcc that support
> lambdas and clang doesn't do lambdas yet, so there should still be the
> freedom to pick a meaningful ABI for Apple platforms that makes the
> two technologies compatible. If Apple can change its ABIs to unify C++
> and ObjC exceptions, then surely it can set up its ABI to make blocks
> and lambdas interoperable.
>
>
>
>
> Bottom line....
>
>
> I'm a 3rd party developer that has to share code between OSX and
> Windows....a description I'd say likely applies to the majority of mac
> developers. The clang team is building this compiler for people like
> me to use. My statement is....don't make me, the customer, have to go
> through coding gymnastics to make my standard code work with Apple's
> platforms. Don't force me to use non-standard code structures for
> force me to have to write compatibility wrappers unless it is
> necessary. This stuff is extra work that makes my code more complex
> and less maintainable.
>
>
> I'm not going to put on any pretense that I understand the technology
> necessary to make blocks and lambdas interoperable. I have a fair
> amount of knowledge, but this is not my area of expertise. I don't
> daily work on compilers and libraries. I'm doing my best to
> communicate (as a general statement) to you guys who are compiler and
> library guys that we need to maximize interoperability with C++
> standards and Apple-specific APIs so that people like me can deliver
> higher quality apps to market more quickly. I don't think that is an
> unreasonable statement.
>
>
>
>
> -James
>
>
>
>
>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 5428 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20110210/17a78869/attachment.bin>
More information about the cfe-dev
mailing list