Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:26607 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 94954 invoked by uid 1010); 15 Nov 2006 17:06:48 -0000 Delivered-To: ezmlm-scan-internals@lists.php.net Delivered-To: ezmlm-internals@lists.php.net Received: (qmail 94938 invoked from network); 15 Nov 2006 17:06:48 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 15 Nov 2006 17:06:48 -0000 X-Host-Fingerprint: 88.64.158.92 dslb-088-064-158-092.pools.arcor-ip.net Received: from [88.64.158.92] ([88.64.158.92:28694] helo=localhost.localdomain) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 40/51-21305-3294B554 for ; Wed, 15 Nov 2006 12:06:45 -0500 Message-ID: <40.51.21305.3294B554@pb1.pair.com> To: internals@lists.php.net Date: Wed, 15 Nov 2006 18:06:42 +0100 User-Agent: Thunderbird 1.5.0.7 (Windows/20060909) MIME-Version: 1.0 References: In-Reply-To: Content-Type: text/plain; charset=ISO-8859-15; format=flowed Content-Transfer-Encoding: 7bit X-Posted-By: 88.64.158.92 Subject: Re: Feature-Request - Macros From: phpinternals@thunder-2000.com (Mathias Bank) Mathias Bank schrieb: > Hallo, > > you know, that there was often a discussion about a "ifsetor" function. > I want to generalize this discussion. If you know LISP, there is a > fantastic macro function which allows you to generate own syntax (not a > c macro function, which is really bad). It would be fantastic, if php > could implement such a macro function. One example (for ifsetor): you > could define > > macro ifsetor($param1, $param2) { > return "if (isset($param1)) return $param1; else return $param2; > } > > use: $test = ifsetor($_GET["blubb"],null); > > All you have to do is to not execute the parameters given in the macro > parameter list. Instead, you have to evaluate the return statement and > then to execute this statement. > > In this way, all discussions about ifsetor (or anything like this) could > be avoided. > > The macro function could even be extended to allow new blocks, but then > we have to extend the syntax to allow reference to the body. In this > way, I always extend the syntax of the parameter data: only variables > would be matched. > > macro foreachkey($array as $key, :body $body) { > return "foreach ($array as $key=>$__dev0) { > $body > }"; > } > > know, you can call > $secondArray = array(); > foreachkey($myArray as $myKey) { > $secondArray[] = $myKey; > } > > this would be extended to > foreach ($myArray as $myKey=>$__dev0) { > $secondArray[] = $myKey; > } > > and this code will be executed. > > As you see, with this macro functions, it could be achieved any > individual syntax. It would be a pleasure, if php could support it. It > could shorten a lot of code. > > Mathias I have recieved a few mails which have shown, that some people misunderstood my idea. It seems, that most of you know c/c++ macros. But I don't want to implement these macro functionality, because this functionality is really poor. Have a look at the macro functionality of lisp: http://www.gigamonkeys.com/book/macros-standard-control-constructs.html and http://www.gigamonkeys.com/book/macros-defining-your-own.html. There, it is described, what macros in lisp can do. You will see, that such macros cannot be compared with c/c++ macros. But it would be a pleasure for php, if such macros would be possible. You should really read it, I couldn't believe it until I have realized it at my own. PHP is a really great language and the syntax is much better than the syntax of lisp. But the macros are one big pleasure in lisp. And don't mistake lisp macros for c macros. They are much more powerful. Mathias