<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Brainfuck-TMP]]></title><description><![CDATA[<p>Man erinnere sich an den Brainfuck-TMP Interpreter Thread von camper.</p>
<p>Ich habe mich jetzt auch an einen gesetzt, aber viel besser ist er nicht geworden: <a href="http://codepad.org/4zBw8d5f" rel="nofollow">http://codepad.org/4zBw8d5f</a></p>
<p>Aktuell kompiliert es auch nur der Clang 3.3 (oder höher, habe das allerdings nicht getestet). GCC 4.9 steigt wegen einem falschen Feldindex aus - wie er da abkommt ist mir unklar.</p>
<p>Zwar ist die Rekursionstiefe gesunken, Programme mit einer Code(!)länge von mehr als 256 oder Schleifen benötigen bei Clang aber eine höhere Instantiierungstiefe als Flag (Clang meckert bei 256).</p>
<p>Dann habe ich den Thread tatsächlich noch einmal ausgegraben, und siehe da:</p>
<p>camper schrieb:</p>
<blockquote>
<p>Ich habe eine Idee wie man das Ganze 1000mal effektiver machen kann (kein Scherz, damit wären dann auch kompliziertere Sachen machbar). Dummerweise unterstützt g++ noch keine constexpr Literale als statische Member, deshalb muss die Implementation noch ein bisschen warten.</p>
</blockquote>
<p>Leider war ihm noch nicht langweilig genug.</p>
<p>Falls er sich noch an die Idee erinnert, dann wäre das interessant.</p>
<p>Mir fällt eine andere Variante ein, die Rekursion stark zu reduzieren: Gespaltene Auswertung für <code>interpreter</code> .<br />
Also zuerst die eine Hälfte auswerten, dann die andere mit den Ergebnissen aus Hälfte 1.<br />
Nun kann man leider nicht Schleifen in der Mitte spalten, daher klappt kein einfaches <code>split_at</code> . Man könnte natürlich alles zwischen den Schleifen spalten, und alles darin demselben Prozess hinterziehen.<br />
Aber das würde mir jetzt zu viel Arbeit abverlangen.</p>
<p>Daher: Was meinte camper mit constexpr-Literalen? Das hört sich interessant an. UDLs*? Die können aber nicht als Member auftreten, nur im namespace-scope...</p>
<p>Btw: Clang ! Komplett Bugfrei. Bei GCC 4.9 (Snapshot vom 9. September) kam ich schnell an die Grenzen. Clang ist viel besser als erwartet, Fehlermeldungen sind auch sehr nett. Ich wusste nie, warum es permanent hochgepriesen wird...</p>
<p>* Das findet man über <a href="https://www.google.co.uk/search?q=udl&amp;ie=utf-8&amp;oe=utf-8&amp;rls=org.mozilla:en-US:official&amp;client=firefox-a&amp;gws_rd=cr&amp;ei=oElQUr_gN5DI0AXKq4GgDg#q=udl+c%2B%2B&amp;rls=org.mozilla:en-US%3Aofficial&amp;safe=off" rel="nofollow">Google</a>! User-Defined Literal. Kann man natürlich <code>constexpr</code> deklarieren, ist schließlich eine (mehr oder weniger gewöhnliche) Funktion.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/320632/brainfuck-tmp</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Jul 2026 15:31:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/320632.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 05 Oct 2013 18:41:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Brainfuck-TMP on Sat, 05 Oct 2013 18:41:26 GMT]]></title><description><![CDATA[<p>Man erinnere sich an den Brainfuck-TMP Interpreter Thread von camper.</p>
<p>Ich habe mich jetzt auch an einen gesetzt, aber viel besser ist er nicht geworden: <a href="http://codepad.org/4zBw8d5f" rel="nofollow">http://codepad.org/4zBw8d5f</a></p>
<p>Aktuell kompiliert es auch nur der Clang 3.3 (oder höher, habe das allerdings nicht getestet). GCC 4.9 steigt wegen einem falschen Feldindex aus - wie er da abkommt ist mir unklar.</p>
<p>Zwar ist die Rekursionstiefe gesunken, Programme mit einer Code(!)länge von mehr als 256 oder Schleifen benötigen bei Clang aber eine höhere Instantiierungstiefe als Flag (Clang meckert bei 256).</p>
<p>Dann habe ich den Thread tatsächlich noch einmal ausgegraben, und siehe da:</p>
<p>camper schrieb:</p>
<blockquote>
<p>Ich habe eine Idee wie man das Ganze 1000mal effektiver machen kann (kein Scherz, damit wären dann auch kompliziertere Sachen machbar). Dummerweise unterstützt g++ noch keine constexpr Literale als statische Member, deshalb muss die Implementation noch ein bisschen warten.</p>
</blockquote>
<p>Leider war ihm noch nicht langweilig genug.</p>
<p>Falls er sich noch an die Idee erinnert, dann wäre das interessant.</p>
<p>Mir fällt eine andere Variante ein, die Rekursion stark zu reduzieren: Gespaltene Auswertung für <code>interpreter</code> .<br />
Also zuerst die eine Hälfte auswerten, dann die andere mit den Ergebnissen aus Hälfte 1.<br />
Nun kann man leider nicht Schleifen in der Mitte spalten, daher klappt kein einfaches <code>split_at</code> . Man könnte natürlich alles zwischen den Schleifen spalten, und alles darin demselben Prozess hinterziehen.<br />
Aber das würde mir jetzt zu viel Arbeit abverlangen.</p>
<p>Daher: Was meinte camper mit constexpr-Literalen? Das hört sich interessant an. UDLs*? Die können aber nicht als Member auftreten, nur im namespace-scope...</p>
<p>Btw: Clang ! Komplett Bugfrei. Bei GCC 4.9 (Snapshot vom 9. September) kam ich schnell an die Grenzen. Clang ist viel besser als erwartet, Fehlermeldungen sind auch sehr nett. Ich wusste nie, warum es permanent hochgepriesen wird...</p>
<p>* Das findet man über <a href="https://www.google.co.uk/search?q=udl&amp;ie=utf-8&amp;oe=utf-8&amp;rls=org.mozilla:en-US:official&amp;client=firefox-a&amp;gws_rd=cr&amp;ei=oElQUr_gN5DI0AXKq4GgDg#q=udl+c%2B%2B&amp;rls=org.mozilla:en-US%3Aofficial&amp;safe=off" rel="nofollow">Google</a>! User-Defined Literal. Kann man natürlich <code>constexpr</code> deklarieren, ist schließlich eine (mehr oder weniger gewöhnliche) Funktion.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358158</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358158</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sat, 05 Oct 2013 18:41:26 GMT</pubDate></item><item><title><![CDATA[Reply to Brainfuck-TMP on Sun, 06 Oct 2013 12:55:55 GMT]]></title><description><![CDATA[<p>Mit C++14 habe ich mich gleichzeitig auf das kinderleichte Umwandeln von String-Literalen zu compile-time Strings gefreut - aber zu früh.<br />
Dank einem <a href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3599.html" rel="nofollow">Proposal</a> könnte man dann nämlich UDLs folgendermaßen definieren:</p>
<pre><code>template&lt;typename CharT, CharT... str&gt;
const_string&lt;str...&gt; operator &quot;&quot; _static(); //Edit: Man sollte natürlich direkt die verarbeitende Klasse als Rückgabetyp definieren - irgendeinen Interpreter o.ä.
</code></pre>
<p>Und per <code>decltype</code> den Typ bekommen.<br />
Im aktuellen C++14-Draft ist aber leider derartiges nicht enthalten... obwohl es sehr sinnvoll ist... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358289</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sun, 06 Oct 2013 12:55:55 GMT</pubDate></item><item><title><![CDATA[Reply to Brainfuck-TMP on Sun, 06 Oct 2013 19:52:43 GMT]]></title><description><![CDATA[<p>Kann man UDL Operatoren nicht mit Automatic Return Type Deduction zusammen verwenden?<br />
Also</p>
<pre><code class="language-cpp">template&lt;typename CharT, CharT... str&gt;
auto operator &quot;&quot; _foo();
</code></pre>
<p>Oder geht es dir um etwas anderes? Bin nicht sicher ob ich dich richtig verstanden habe...</p>
<p>EDIT: decltype(auto) -&gt; auto</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358413</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358413</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 06 Oct 2013 19:52:43 GMT</pubDate></item><item><title><![CDATA[Reply to Brainfuck-TMP on Sun, 26 Apr 2015 14:29:38 GMT]]></title><description><![CDATA[<p>Nein, der Punkt ist ja, dass ich dann folgendes Makro schreiben kann:</p>
<pre><code>#define STRING(str) decltype( str##_static )

STRING(&quot;abc&quot;) // wird zu const_string&lt;'a', 'b', 'c'&gt;
</code></pre>
<p>Und dann wird einfach der Compiler den String in ein Parameter-Pack umwandeln. Super, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358421</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358421</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sun, 26 Apr 2015 14:29:38 GMT</pubDate></item><item><title><![CDATA[Reply to Brainfuck-TMP on Sun, 06 Oct 2013 19:55:37 GMT]]></title><description><![CDATA[<p>Ich hatte das mit <code>decltype(auto)</code> in Erinnerung, aber anscheinend gehört da nur <code>auto</code> hin.</p>
<p><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3638.html" rel="nofollow">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3638.html</a></p>
<ul>
<li>schrieb:</li>
</ul>
<blockquote>
<p>Nein, der Punkt ist ja, dass ich dann folgendes Makro schreiben kann:</p>
<pre><code>#define STRING(str) decltype( str##_static )

STRING(&quot;abc&quot;) // wird zu const_string&lt;'a', 'b', 'c'&gt;
</code></pre>
<p>Und dann wird einfach der Compiler den String in ein Parameter-Pack umwandeln. Super, oder?</p>
</blockquote>
<p>OK, verstehe.</p>
<p>Nur was bringt dir das?<br />
Du kannst ja gleich vom UDL-Operator den fertigen Interpreter zurückgeben lassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358427</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358427</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 06 Oct 2013 19:55:37 GMT</pubDate></item><item><title><![CDATA[Reply to Brainfuck-TMP on Sun, 06 Oct 2013 20:09:44 GMT]]></title><description><![CDATA[<blockquote>
<p>Du kannst ja gleich vom UDL-Operator den fertigen Interpreter zurückgeben lassen.</p>
</blockquote>
<p>Was meinst du genau? Ohne das Proposal sind UDLs nicht wirklich hilfreich, denn dann kann eine Operatorfunktion nur so aussehen:</p>
<pre><code>Rueckgabetyp operator &quot;&quot; ( char const* ptr, std::size_t len )
</code></pre>
<p>Und was bringt mir das? Oder was meinst du?</p>
<p>(Mit &quot;fertigen Interpreter zurückgeben&quot; meinte ich, dass man das Parameterpack stattdessen an den Interpreter gibt. Das Parameterpack muss aber erstmal da sein...)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358432</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358432</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sun, 06 Oct 2013 20:09:44 GMT</pubDate></item><item><title><![CDATA[Reply to Brainfuck-TMP on Sun, 06 Oct 2013 20:12:20 GMT]]></title><description><![CDATA[<p>OK, ich hab das falsch verstanden. Ich dachte die Sache mit dem Parameter-Pack wäre schon beschlossen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358433</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358433</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 06 Oct 2013 20:12:20 GMT</pubDate></item><item><title><![CDATA[Reply to Brainfuck-TMP on Mon, 07 Oct 2013 13:10:08 GMT]]></title><description><![CDATA[<ul>
<li>schrieb:</li>
</ul>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Ich habe eine Idee wie man das Ganze 1000mal effektiver machen kann (kein Scherz, damit wären dann auch kompliziertere Sachen machbar). Dummerweise unterstützt g++ noch keine constexpr Literale als statische Member, deshalb muss die Implementation noch ein bisschen warten.</p>
</blockquote>
<p>Leider war ihm noch nicht langweilig genug.</p>
</blockquote>
<p>Ich habe weiter hinten dann mal eine zweite Version gepostet, die die Ideen die ich damals hatte einigermaßen umsetzt. Allerdings war ich zu optimistisch, wass die Compilertechnologie angeht. Diese zweite Version benötigt tatsächlich deutlich weniger Speicher zum Compilieren, ist allerdings gleichzeitig um Größenordnungen langsamer (etwas über einer Stunde statt ein paar Sekunden - mit 99-bottles-code aus dem Netz), was primär daran liegen dürfte, dass der Compiler sich das Ergebnis einer Überladungsauflösung (der Prozess ist ja relativ teuer, noch etwas mahr als die Auswahl der richtigen Spezialisierung bei partiell spezialisierten Klassentemplates) nicht zu merken scheint.<br />
Die Sache mit den Literalen war sowieso ein Missverständniss. Damals nahm ich noch an, die Templateform für solche Operatoren wäre auch bei Stringliteralen möglich. Eine praktisch meist ausreichende Lösung über Makros ist nicht allzu kompliziert - Sone hat bestimmt fertigen Code dafür.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358544</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 07 Oct 2013 13:10:08 GMT</pubDate></item><item><title><![CDATA[Reply to Brainfuck-TMP on Mon, 07 Oct 2013 13:27:05 GMT]]></title><description><![CDATA[<blockquote>
<p>Sone hat bestimmt fertigen Code dafür.</p>
</blockquote>
<p>Ich bin Sone.</p>
<p>Und ja, den Code habe ich schon längst.</p>
<pre><code>template&lt;char ... args&gt;
	using const_string = value_list&lt;char, args...&gt;;

	#define SPLIT_1(s, x) ( x &lt; sizeof(s) ? s[x] : '\0' )
	#define SPLIT_4(s, x)    SPLIT_1  (s, x), SPLIT_1  (s, x+1)  , SPLIT_1  (s, x+2)  , SPLIT_1  (s, x+3)
	#define SPLIT_16(s, x)   SPLIT_4  (s, x), SPLIT_4  (s, x+4)  , SPLIT_4  (s, x+8)  , SPLIT_4  (s, x+12)
	#define SPLIT_64(s, x)   SPLIT_16 (s, x), SPLIT_16 (s, x+16) , SPLIT_16 (s, x+32) , SPLIT_16 (s, x+48)
	#define SPLIT_256(s, x)  SPLIT_64 (s, x), SPLIT_64 (s, x+64) , SPLIT_64 (s, x+128 , SPLIT_64 (s, x+194)
	#define SPLIT_1024(s, x) SPLIT_256(s, x), SPLIT_256(s, x+256), SPLIT_256(s, x+512), SPLIT_256(s, x+768)

	#define STRING_IMPL(str, n) rtrim&lt;const_string&lt;SPLIT_##n(str, 0)&gt;, '\0'&gt;::type

	#define STRING(str) STRING_IMPL(str, 64)
	#define STRING_256(str) STRING_IMPL(str, 256)
	#define STRING_1024(str) STRING_IMPL(str, 1024)
</code></pre>
<p>Wobei rtrim den String dann abschneidet. Findet sich alles in VTMPL.</p>
<blockquote>
<p>Ich habe weiter hinten dann mal eine zweite Version gepostet, die die Ideen die ich damals hatte einigermaßen umsetzt.</p>
</blockquote>
<p>Gut, habe ich nicht gesehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358551</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358551</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 07 Oct 2013 13:27:05 GMT</pubDate></item></channel></rss>