On 5/3/2016 8:57 PM, Sara Golemon wrote:
> Ooops, missed a negation when I typed it out.
> 
> "Pretending that poorly designed libraries DON'T exist is naîve."
> 

I am not pretending that they do not exist, quite the contrary, I
explicitly stated that they exist and that I fear that this syntactic
sugar yields more of them in the future.

On 5/3/2016 8:57 PM, Sara Golemon wrote:
> As I've said already.  Yes, intermediate variables do address this
> style of coding.  Yes, this proposal is syntactic sugar.
> 
> Intermediate variables also add cognitive overhead of their own in
> cataloging all the various intermediates used in a large function.  By
> removing the explicit intermediate variables and replacing them with
> unnamed temporaries, the code becomes easier to read because there's
> less unnecessary assignments cluttering up the space.
> 

Still waiting for a real life example that illustrates exactly that. All
examples and code I have seen so far is either extremely constructed
(the request-application-response thingy that is now part of the RFC) or
can be trivially rewritten to be super expressive and readable (the
original from the RFC and most in this thread).

  $request = getGlobals()
   |> parseRequest($$)
   |> buildPsr7Request($$);

Ask, don't tell!

  final class RequestBuilder {

    public static function fromGlobals() {
      return new static($_GLOBALS);
    }

    public function buildPsr7Request() {
      $parsed_request = $this->parseRequest();
      return new Psr7Request($parsed_request);
    }

  }

  $request = RequestBuilder::fromGlobals()->buildPsr7Request();

  $response = loadConfig()
   |> buildDic($$)
   |> getApp($$)
   |> getRouter($app)
   |> getDispatcher($$, $request)
   |> dispatchBusinessLogic($$, $request, new Response())
   |> renderResponse($$)
   |> buildPsr7Response($$)
   |> emit($$);

Ask, don't tell!

  final class ResponseBuilder {

    public static function fromGlobals() {
      return new static($_GLOBALS);
    }

    public function build() {
      $this->loadConfig();
      $this->buildDic();
      $this->buildApp();
      $this->buildRouter();
      $this->buildDispatcher();
      $this->dispatchBusinessLogic();
      $this->parseResponse();

      return $this->response;
    }

  }

  $response = ResponseBuilder::fromGlobals()->build();

The third is exactly the same ...

Now my favorite:

  $ret =
    array_merge(
      $ret,
      getFileArg(
        array_map(
          function ($x) use ($arg) { return $arg . '/' . $x; },
          array_filter(
            scandir($arg),
            function ($x) { return $x !== '.' && $x !== '..'); }
          )
        )
      )
    );

I already rewrote it in another message but once more with the most
relevant parts of my original message:

array_filter with O(n)

array_map with O(n)

array_merge with O(∑ array_i, i != 1) and in our case O(n) where n
equals the total count of elements in $files/$$.

In my universe `getFileArg` (note the absence of a plural form) would
operate on a single path and not on an array of paths:

  foreach (new DirectoryIterator($arg) as $path) {
    if ($path->isDot() === false) {
      $ret[] = getFileArg($arg . DIRECTORY_SEPARATOR . $path);
    }
  }

Ocramius mentioned that the pipe operator would be super useful in async
libraries and stuff but I am lacking real world examples here that
illustrate how this new operator would make those experimental stuff
benefit from it. Especially benefit besides scalar objects.

-- 
Richard "Fleshgrinder" Fussenegger

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to