<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	
	>
<channel>
	<title>
	Comments on: A note about programming language design	</title>
	<atom:link href="https://the-witness.net/news/2012/09/a-note-about-programming-language-design/feed/" rel="self" type="application/rss+xml" />
	<link>https://the-witness.net/news/2012/09/a-note-about-programming-language-design/</link>
	<description>Explore an abandoned island.</description>
	<lastBuildDate>Fri, 02 Dec 2016 17:52:59 +0000</lastBuildDate>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.9</generator>
	<item>
		<title>
		By: Sam		</title>
		<link>https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8684100</link>

		<dc:creator><![CDATA[Sam]]></dc:creator>
		<pubDate>Fri, 02 Dec 2016 17:52:59 +0000</pubDate>
		<guid isPermaLink="false">https://the-witness.net/news/?p=3085#comment-8684100</guid>

					<description><![CDATA[In reply to &lt;a href=&quot;https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8683931&quot;&gt;Jonathan Blow&lt;/a&gt;.

Oh, nevermind. I thought UFCS was something else for some reason. I was thinking of the way lisp&#039;s built-in semantics have the same syntax as user-defined semantics. Yeah, I agree UFCS doesn&#039;t solve the problem you are describing here. Python has something like that and it always irked me. Like, if you are locked into a classical OOP mindset and everything is always a method.. maybe it makes sense.. but then why did you want UFCS to begin with.

I kind of like the way JavaScript does this (I also hate the way JavaScript does this for other reasons). In JavaScript methods are just functions that happen to also be properties of objects. In a weird way it&#039;s almost the opposite of UFCS..]]></description>
			<content:encoded><![CDATA[<p>In reply to <a href="https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8683931">Jonathan Blow</a>.</p>
<p>Oh, nevermind. I thought UFCS was something else for some reason. I was thinking of the way lisp&#8217;s built-in semantics have the same syntax as user-defined semantics. Yeah, I agree UFCS doesn&#8217;t solve the problem you are describing here. Python has something like that and it always irked me. Like, if you are locked into a classical OOP mindset and everything is always a method.. maybe it makes sense.. but then why did you want UFCS to begin with.</p>
<p>I kind of like the way JavaScript does this (I also hate the way JavaScript does this for other reasons). In JavaScript methods are just functions that happen to also be properties of objects. In a weird way it&#8217;s almost the opposite of UFCS..</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		By: Jonathan Blow		</title>
		<link>https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8683931</link>

		<dc:creator><![CDATA[Jonathan Blow]]></dc:creator>
		<pubDate>Fri, 02 Dec 2016 01:26:42 +0000</pubDate>
		<guid isPermaLink="false">https://the-witness.net/news/?p=3085#comment-8683931</guid>

					<description><![CDATA[In reply to &lt;a href=&quot;https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8683848&quot;&gt;Sam&lt;/a&gt;.

How is it *not* an overcomplication?

You have two totally parallel systems and syntax-sets that do the same thing. (&quot;Object method calls&quot; and &quot;procedures taking a struct pointer as their first argument&quot;). Why?]]></description>
			<content:encoded><![CDATA[<p>In reply to <a href="https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8683848">Sam</a>.</p>
<p>How is it *not* an overcomplication?</p>
<p>You have two totally parallel systems and syntax-sets that do the same thing. (&#8220;Object method calls&#8221; and &#8220;procedures taking a struct pointer as their first argument&#8221;). Why?</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		By: Sam		</title>
		<link>https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8683848</link>

		<dc:creator><![CDATA[Sam]]></dc:creator>
		<pubDate>Thu, 01 Dec 2016 18:46:12 +0000</pubDate>
		<guid isPermaLink="false">https://the-witness.net/news/?p=3085#comment-8683848</guid>

					<description><![CDATA[You say: &quot;the idea of UFCS is just a massive overcomplication&quot;

This seems to me like a bold statement in need of some justification. Like, I&#039;m not advocating for writing games in lisp, the library support isn&#039;t there. But from the perspective of a brand new programmer, how is uniform function call syntax an overcomplication?

btw: I loved The Witness, thanks for making it :)]]></description>
			<content:encoded><![CDATA[<p>You say: &#8220;the idea of UFCS is just a massive overcomplication&#8221;</p>
<p>This seems to me like a bold statement in need of some justification. Like, I&#8217;m not advocating for writing games in lisp, the library support isn&#8217;t there. But from the perspective of a brand new programmer, how is uniform function call syntax an overcomplication?</p>
<p>btw: I loved The Witness, thanks for making it :)</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		By: Oscar Campbell		</title>
		<link>https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8459172</link>

		<dc:creator><![CDATA[Oscar Campbell]]></dc:creator>
		<pubDate>Mon, 16 Nov 2015 16:33:08 +0000</pubDate>
		<guid isPermaLink="false">https://the-witness.net/news/?p=3085#comment-8459172</guid>

					<description><![CDATA[I find UFCS to be a really good take on programming. It&#039;s &quot;only&quot; a syntactic construction, that allows expressing code as clear as possible in its&#039; context. Almost.
I&#039;m currently working on Onyx language, where I&#039;m pondering (leaning heavily towards) implementing UFCS.
The pro is, in Onyx, _only_ member funcs (&quot;methods&quot;) of a type can access private state - but you can of course make getters/setters simply with sugar, and they of course compile to direct accesses in machine code - no loss. And _if_ you need to add logic, snap: done, _if_ you need to add locking for concurrency, snap: done.

The model works around defining a type and the smallest set of methods necessary to work with its state, the rest of logic is likely best off implemented as &quot;free functions&quot; (which then brings us to UFCS), since they can match and cover several types horizontally too (ducktyped - &quot;it has the methods needed? It works.&quot; [Of course sumtypes, virtual (&quot;ancestor&quot;) types, generics and unique typing is fully available also - pick and choose, mix and match.]) (DRY!), and has to go through accessor methods for the data (encapsulation).

Pretty much win win in my book.]]></description>
			<content:encoded><![CDATA[<p>I find UFCS to be a really good take on programming. It&#8217;s &#8220;only&#8221; a syntactic construction, that allows expressing code as clear as possible in its&#8217; context. Almost.<br />
I&#8217;m currently working on Onyx language, where I&#8217;m pondering (leaning heavily towards) implementing UFCS.<br />
The pro is, in Onyx, _only_ member funcs (&#8220;methods&#8221;) of a type can access private state &#8211; but you can of course make getters/setters simply with sugar, and they of course compile to direct accesses in machine code &#8211; no loss. And _if_ you need to add logic, snap: done, _if_ you need to add locking for concurrency, snap: done.</p>
<p>The model works around defining a type and the smallest set of methods necessary to work with its state, the rest of logic is likely best off implemented as &#8220;free functions&#8221; (which then brings us to UFCS), since they can match and cover several types horizontally too (ducktyped &#8211; &#8220;it has the methods needed? It works.&#8221; [Of course sumtypes, virtual (&#8220;ancestor&#8221;) types, generics and unique typing is fully available also &#8211; pick and choose, mix and match.]) (DRY!), and has to go through accessor methods for the data (encapsulation).</p>
<p>Pretty much win win in my book.</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		By: clemzio		</title>
		<link>https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8440501</link>

		<dc:creator><![CDATA[clemzio]]></dc:creator>
		<pubDate>Thu, 08 Oct 2015 14:54:52 +0000</pubDate>
		<guid isPermaLink="false">https://the-witness.net/news/?p=3085#comment-8440501</guid>

					<description><![CDATA[In reply to &lt;a href=&quot;https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8439098&quot;&gt;Tom&lt;/a&gt;.

Somehow it also got posted to hacker news and made it front page: https://news.ycombinator.com/item?id=10346985]]></description>
			<content:encoded><![CDATA[<p>In reply to <a href="https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8439098">Tom</a>.</p>
<p>Somehow it also got posted to hacker news and made it front page: <a href="https://news.ycombinator.com/item?id=10346985" rel="nofollow ugc">https://news.ycombinator.com/item?id=10346985</a></p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		By: clemzio		</title>
		<link>https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8439978</link>

		<dc:creator><![CDATA[clemzio]]></dc:creator>
		<pubDate>Wed, 07 Oct 2015 15:30:37 +0000</pubDate>
		<guid isPermaLink="false">https://the-witness.net/news/?p=3085#comment-8439978</guid>

					<description><![CDATA[In reply to &lt;a href=&quot;https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8439098&quot;&gt;Tom&lt;/a&gt;.

Whomever did this, thank you!]]></description>
			<content:encoded><![CDATA[<p>In reply to <a href="https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8439098">Tom</a>.</p>
<p>Whomever did this, thank you!</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		By: Tom		</title>
		<link>https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8439098</link>

		<dc:creator><![CDATA[Tom]]></dc:creator>
		<pubDate>Tue, 06 Oct 2015 00:34:09 +0000</pubDate>
		<guid isPermaLink="false">https://the-witness.net/news/?p=3085#comment-8439098</guid>

					<description><![CDATA[Hi Jon!
Are you aware of the Jai Primer wrote by Jorge?
https://sites.google.com/site/jailanguageprimer/

Regards,
Tom.]]></description>
			<content:encoded><![CDATA[<p>Hi Jon!<br />
Are you aware of the Jai Primer wrote by Jorge?<br />
<a href="https://sites.google.com/site/jailanguageprimer/" rel="nofollow ugc">https://sites.google.com/site/jailanguageprimer/</a></p>
<p>Regards,<br />
Tom.</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		By: Mark		</title>
		<link>https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8437056</link>

		<dc:creator><![CDATA[Mark]]></dc:creator>
		<pubDate>Fri, 02 Oct 2015 07:43:45 +0000</pubDate>
		<guid isPermaLink="false">https://the-witness.net/news/?p=3085#comment-8437056</guid>

					<description><![CDATA[In reply to &lt;a href=&quot;https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8436760&quot;&gt;Yuri&lt;/a&gt;.

Being able to call member functions with the same syntax as regular functions (and vice versa) is very nice - just so long as you don&#039;t loose sight of the value of having a closed set of member functions.

Member functions have privileged access to the data inside an object.  It is often crucial that object data be accessed in a particular way to ensure correct function (eg: locking mutexes in the correct order).  If the designer of a class cannot restrict the access to a known set of functions at design time it becomes impossible to write robust code.

Still - I do like the idea of being able to call free functions, which are themselves only implemented using the original class interface, as if they are members.]]></description>
			<content:encoded><![CDATA[<p>In reply to <a href="https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8436760">Yuri</a>.</p>
<p>Being able to call member functions with the same syntax as regular functions (and vice versa) is very nice &#8211; just so long as you don&#8217;t loose sight of the value of having a closed set of member functions.</p>
<p>Member functions have privileged access to the data inside an object.  It is often crucial that object data be accessed in a particular way to ensure correct function (eg: locking mutexes in the correct order).  If the designer of a class cannot restrict the access to a known set of functions at design time it becomes impossible to write robust code.</p>
<p>Still &#8211; I do like the idea of being able to call free functions, which are themselves only implemented using the original class interface, as if they are members.</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		By: Yuri		</title>
		<link>https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8436760</link>

		<dc:creator><![CDATA[Yuri]]></dc:creator>
		<pubDate>Thu, 01 Oct 2015 17:30:59 +0000</pubDate>
		<guid isPermaLink="false">https://the-witness.net/news/?p=3085#comment-8436760</guid>

					<description><![CDATA[I like to think that member functions is just a syntactic sugar.
1. any function is static (not member)
2. you can call any function both bar(foo) and foo.bar(), and the only difference - is where you put your first argument.
So name &quot;member function&quot;, or method, is just a synonym to &quot;use this object as the first argument&quot;. And declaring function as &quot;member&quot; - is just sugar for declaring function with specific first argument. And &quot;dot&quot; - is just a binary operator that gives obj from the left to the function on the right.

There are many profits:
1. you can easily add any &quot;extension&quot; to any object by just declaring usual function.
2. your IDE knows what to show after your &quot;obj.&quot;
3. it is simplification for user, not a complication (as extensions, for ex.)

My ideal language will behave just in that way.

(I think that ArrayList would be a better illustration than Vector3)]]></description>
			<content:encoded><![CDATA[<p>I like to think that member functions is just a syntactic sugar.<br />
1. any function is static (not member)<br />
2. you can call any function both bar(foo) and foo.bar(), and the only difference &#8211; is where you put your first argument.<br />
So name &#8220;member function&#8221;, or method, is just a synonym to &#8220;use this object as the first argument&#8221;. And declaring function as &#8220;member&#8221; &#8211; is just sugar for declaring function with specific first argument. And &#8220;dot&#8221; &#8211; is just a binary operator that gives obj from the left to the function on the right.</p>
<p>There are many profits:<br />
1. you can easily add any &#8220;extension&#8221; to any object by just declaring usual function.<br />
2. your IDE knows what to show after your &#8220;obj.&#8221;<br />
3. it is simplification for user, not a complication (as extensions, for ex.)</p>
<p>My ideal language will behave just in that way.</p>
<p>(I think that ArrayList would be a better illustration than Vector3)</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		By: Dev		</title>
		<link>https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8427949</link>

		<dc:creator><![CDATA[Dev]]></dc:creator>
		<pubDate>Mon, 14 Sep 2015 22:42:32 +0000</pubDate>
		<guid isPermaLink="false">https://the-witness.net/news/?p=3085#comment-8427949</guid>

					<description><![CDATA[In reply to &lt;a href=&quot;https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8427944&quot;&gt;Dev&lt;/a&gt;.

PS: I respect your opinion, did not want to sound mean!]]></description>
			<content:encoded><![CDATA[<p>In reply to <a href="https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8427944">Dev</a>.</p>
<p>PS: I respect your opinion, did not want to sound mean!</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		By: Dev		</title>
		<link>https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8427944</link>

		<dc:creator><![CDATA[Dev]]></dc:creator>
		<pubDate>Mon, 14 Sep 2015 22:37:05 +0000</pubDate>
		<guid isPermaLink="false">https://the-witness.net/news/?p=3085#comment-8427944</guid>

					<description><![CDATA[In reply to &lt;a href=&quot;https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8427412&quot;&gt;Jonathan Blow&lt;/a&gt;.

Not really:

&#062; So in reality, you want Vector3 to define only a common piece of data to be exchanged

Precisely how it&#039;s done in MonoGame PCL.

&#062; You can provide default functions for operating on Vector3, but in a way that people can easily shadow them with their own functions or else use a completely disjoint set.

Precisely achieved by extension methods.

&#062; I wish people would stop telling me that member functions are good because you can do obj . and get a list of procs in the IDE after typing the dot.

I wish people would stop saying object model is bad just because it can be abused :).]]></description>
			<content:encoded><![CDATA[<p>In reply to <a href="https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8427412">Jonathan Blow</a>.</p>
<p>Not really:</p>
<p>&gt; So in reality, you want Vector3 to define only a common piece of data to be exchanged</p>
<p>Precisely how it&#8217;s done in MonoGame PCL.</p>
<p>&gt; You can provide default functions for operating on Vector3, but in a way that people can easily shadow them with their own functions or else use a completely disjoint set.</p>
<p>Precisely achieved by extension methods.</p>
<p>&gt; I wish people would stop telling me that member functions are good because you can do obj . and get a list of procs in the IDE after typing the dot.</p>
<p>I wish people would stop saying object model is bad just because it can be abused :).</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		By: Kyle		</title>
		<link>https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8427765</link>

		<dc:creator><![CDATA[Kyle]]></dc:creator>
		<pubDate>Mon, 14 Sep 2015 18:18:00 +0000</pubDate>
		<guid isPermaLink="false">https://the-witness.net/news/?p=3085#comment-8427765</guid>

					<description><![CDATA[I find prototypal languages (ECMAScript, Lua, etc.) seem to provide the most expressiveness in this scenario. Since the inheritance hierarchy is dependent on objects, and the objects are mutable (including their functions), you are able to extend the objects as needed for the scope needed.

However, I&#039;m not aware of any prototypal languages that would be suitable for performance critical systems like game engines (not saying they don&#039;t exist).]]></description>
			<content:encoded><![CDATA[<p>I find prototypal languages (ECMAScript, Lua, etc.) seem to provide the most expressiveness in this scenario. Since the inheritance hierarchy is dependent on objects, and the objects are mutable (including their functions), you are able to extend the objects as needed for the scope needed.</p>
<p>However, I&#8217;m not aware of any prototypal languages that would be suitable for performance critical systems like game engines (not saying they don&#8217;t exist).</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		By: Jonathan Blow		</title>
		<link>https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8427413</link>

		<dc:creator><![CDATA[Jonathan Blow]]></dc:creator>
		<pubDate>Mon, 14 Sep 2015 04:30:55 +0000</pubDate>
		<guid isPermaLink="false">https://the-witness.net/news/?p=3085#comment-8427413</guid>

					<description><![CDATA[In reply to &lt;a href=&quot;https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8426927&quot;&gt;Spencer&lt;/a&gt;.

Not really. I think though you are confusing &quot;OOP&quot; with &quot;providing an abstract interface for some data you don&#039;t need to think about the specifics of&quot;. The latter I do all the time, yes.]]></description>
			<content:encoded><![CDATA[<p>In reply to <a href="https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8426927">Spencer</a>.</p>
<p>Not really. I think though you are confusing &#8220;OOP&#8221; with &#8220;providing an abstract interface for some data you don&#8217;t need to think about the specifics of&#8221;. The latter I do all the time, yes.</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		By: Jonathan Blow		</title>
		<link>https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8427412</link>

		<dc:creator><![CDATA[Jonathan Blow]]></dc:creator>
		<pubDate>Mon, 14 Sep 2015 04:29:55 +0000</pubDate>
		<guid isPermaLink="false">https://the-witness.net/news/?p=3085#comment-8427412</guid>

					<description><![CDATA[In reply to &lt;a href=&quot;https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8427077&quot;&gt;Dev&lt;/a&gt;.

In my opinion &quot;extension methods&quot; are just a further complication of something that should not have been complicated to begin with.]]></description>
			<content:encoded><![CDATA[<p>In reply to <a href="https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8427077">Dev</a>.</p>
<p>In my opinion &#8220;extension methods&#8221; are just a further complication of something that should not have been complicated to begin with.</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		By: Dev		</title>
		<link>https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8427077</link>

		<dc:creator><![CDATA[Dev]]></dc:creator>
		<pubDate>Sun, 13 Sep 2015 16:52:59 +0000</pubDate>
		<guid isPermaLink="false">https://the-witness.net/news/?p=3085#comment-8427077</guid>

					<description><![CDATA[There is no need to compromise and the feature has a name: extension methods.


https://en.wikipedia.org/wiki/Extension_method

http://www.extensionmethod.net

https://msdn.microsoft.com/en-gb/library/bb383977.aspx]]></description>
			<content:encoded><![CDATA[<p>There is no need to compromise and the feature has a name: extension methods.</p>
<p><a href="https://en.wikipedia.org/wiki/Extension_method" rel="nofollow ugc">https://en.wikipedia.org/wiki/Extension_method</a></p>
<p><a href="http://www.extensionmethod.net" rel="nofollow ugc">http://www.extensionmethod.net</a></p>
<p><a href="https://msdn.microsoft.com/en-gb/library/bb383977.aspx" rel="nofollow ugc">https://msdn.microsoft.com/en-gb/library/bb383977.aspx</a></p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		By: Spencer		</title>
		<link>https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8426927</link>

		<dc:creator><![CDATA[Spencer]]></dc:creator>
		<pubDate>Sun, 13 Sep 2015 11:47:49 +0000</pubDate>
		<guid isPermaLink="false">https://the-witness.net/news/?p=3085#comment-8426927</guid>

					<description><![CDATA[I see your point with a Vector3, where the data storage is equivalent to the data structure. But don&#039;t you find OOP useful for structures that don&#039;t well reflect the underlying storage, or that need maintenance? Examples might be storing a binary tree as a flat array (where the indexing can get confusing), or a red-black tree that needs to be rebalanced according to some hidden information.]]></description>
			<content:encoded><![CDATA[<p>I see your point with a Vector3, where the data storage is equivalent to the data structure. But don&#8217;t you find OOP useful for structures that don&#8217;t well reflect the underlying storage, or that need maintenance? Examples might be storing a binary tree as a flat array (where the indexing can get confusing), or a red-black tree that needs to be rebalanced according to some hidden information.</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		By: faiface		</title>
		<link>https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8426915</link>

		<dc:creator><![CDATA[faiface]]></dc:creator>
		<pubDate>Sun, 13 Sep 2015 11:29:49 +0000</pubDate>
		<guid isPermaLink="false">https://the-witness.net/news/?p=3085#comment-8426915</guid>

					<description><![CDATA[I pretty much agree with what younare saying here, however, the method call syntax (object.method()) is very convenient, understandable and nice looking. Sometimes it really makes the code look alot more clean.

One way to solve this problem is to make regular functions callable with the dot syntax, so that you could rewrite this:
    function(object, somethingA, somethingB);
as:
    object.function(somethingA, somethingB)
Basically, when using the dot syntax, the parameter before the dot goes as the first parameter of the function.

This semantics would allow for things like:
    x.factorial();
    &quot;%, %&quot;.format(x, y);
and so on.]]></description>
			<content:encoded><![CDATA[<p>I pretty much agree with what younare saying here, however, the method call syntax (object.method()) is very convenient, understandable and nice looking. Sometimes it really makes the code look alot more clean.</p>
<p>One way to solve this problem is to make regular functions callable with the dot syntax, so that you could rewrite this:<br />
    function(object, somethingA, somethingB);<br />
as:<br />
    object.function(somethingA, somethingB)<br />
Basically, when using the dot syntax, the parameter before the dot goes as the first parameter of the function.</p>
<p>This semantics would allow for things like:<br />
    x.factorial();<br />
    &#8220;%, %&#8221;.format(x, y);<br />
and so on.</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		By: Mackie		</title>
		<link>https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8426800</link>

		<dc:creator><![CDATA[Mackie]]></dc:creator>
		<pubDate>Sun, 13 Sep 2015 07:12:34 +0000</pubDate>
		<guid isPermaLink="false">https://the-witness.net/news/?p=3085#comment-8426800</guid>

					<description><![CDATA[In reply to &lt;a href=&quot;https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8426786&quot;&gt;Pritchard&lt;/a&gt;.

This is the issue because now I am have to program with a GC in *mind* and that seriously adds to my overall mental friction. And, of course, the possible usage of the standard libraries that may allocate from the heap.  On a very large project, this starts to add up. So, a GC is just a non-starter.]]></description>
			<content:encoded><![CDATA[<p>In reply to <a href="https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8426786">Pritchard</a>.</p>
<p>This is the issue because now I am have to program with a GC in *mind* and that seriously adds to my overall mental friction. And, of course, the possible usage of the standard libraries that may allocate from the heap.  On a very large project, this starts to add up. So, a GC is just a non-starter.</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		By: Pritchard		</title>
		<link>https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8426787</link>

		<dc:creator><![CDATA[Pritchard]]></dc:creator>
		<pubDate>Sun, 13 Sep 2015 06:28:01 +0000</pubDate>
		<guid isPermaLink="false">https://the-witness.net/news/?p=3085#comment-8426787</guid>

					<description><![CDATA[In reply to &lt;a href=&quot;https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8426629&quot;&gt;Mackie&lt;/a&gt;.

http://comments.gmane.org/gmane.comp.lang.go.general/37934

This thread was interesting to me.]]></description>
			<content:encoded><![CDATA[<p>In reply to <a href="https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8426629">Mackie</a>.</p>
<p><a href="http://comments.gmane.org/gmane.comp.lang.go.general/37934" rel="nofollow ugc">http://comments.gmane.org/gmane.comp.lang.go.general/37934</a></p>
<p>This thread was interesting to me.</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		By: Pritchard		</title>
		<link>https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8426786</link>

		<dc:creator><![CDATA[Pritchard]]></dc:creator>
		<pubDate>Sun, 13 Sep 2015 06:27:02 +0000</pubDate>
		<guid isPermaLink="false">https://the-witness.net/news/?p=3085#comment-8426786</guid>

					<description><![CDATA[In reply to &lt;a href=&quot;https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8426629&quot;&gt;Mackie&lt;/a&gt;.

The GO garbage collector is fairly flexible though, no?  You can explicitly set how often it should run.  And also inspect how often it&#039;s running through profiling.

http://comments.gmane.org/gmane.comp.lang.go.general/37934

Is &#060; 2% of time spent collecting memory just by restructuring your program data and workflow a little bit that bad?

vs what you save by not using GC at all...  Which I understand can be a lot in some cases.  But I&#039;ve read other people saying that the way Go works, it almost depends on the existence of a GC unless you want to not have certain features and / or manage their memory yourself.  That comes with the runtime.]]></description>
			<content:encoded><![CDATA[<p>In reply to <a href="https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8426629">Mackie</a>.</p>
<p>The GO garbage collector is fairly flexible though, no?  You can explicitly set how often it should run.  And also inspect how often it&#8217;s running through profiling.</p>
<p><a href="http://comments.gmane.org/gmane.comp.lang.go.general/37934" rel="nofollow ugc">http://comments.gmane.org/gmane.comp.lang.go.general/37934</a></p>
<p>Is &lt; 2% of time spent collecting memory just by restructuring your program data and workflow a little bit that bad?</p>
<p>vs what you save by not using GC at all&#8230;  Which I understand can be a lot in some cases.  But I&#039;ve read other people saying that the way Go works, it almost depends on the existence of a GC unless you want to not have certain features and / or manage their memory yourself.  That comes with the runtime.</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		By: Mackie		</title>
		<link>https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8426632</link>

		<dc:creator><![CDATA[Mackie]]></dc:creator>
		<pubDate>Sun, 13 Sep 2015 01:32:32 +0000</pubDate>
		<guid isPermaLink="false">https://the-witness.net/news/?p=3085#comment-8426632</guid>

					<description><![CDATA[Slight typo: I meant &quot;I have&quot; instead of &quot;The have&quot; in the very first sentence.]]></description>
			<content:encoded><![CDATA[<p>Slight typo: I meant &#8220;I have&#8221; instead of &#8220;The have&#8221; in the very first sentence.</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		By: Mackie		</title>
		<link>https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8426629</link>

		<dc:creator><![CDATA[Mackie]]></dc:creator>
		<pubDate>Sun, 13 Sep 2015 01:28:21 +0000</pubDate>
		<guid isPermaLink="false">https://the-witness.net/news/?p=3085#comment-8426629</guid>

					<description><![CDATA[The have already tweeted the following:

This is why I like the way Go deals with member functions. It is a good compromise in the sense that you get clean data structures to share and reason about with the benefits of function fluidity, code reuse, in addition to a convenient mechanism for operating on that data without the rigidity of C++ member function. An example can be found here: 

https://golang.org/ref/spec#Method_expressions

I use strictly C in the embedded space and I get real tired of the following pattern:

struct hardware;
struct hardware_ops{
	int (*read)(struct hardware *hw);
};

struct hardware{
	char data[MAX_DATA_SIZE];
	struct hardware_ops ops;
};

static int hardware_read(struct hardware *hw)
{
	return 0;
}
void hardware_init(struct hardware *hw)
{
 	hw-&#062;ops.read = hardware_read;
}

struct hardware hw;
hardware_init(&#038;hw);

/* Just to do this: */
hw.ops.read(&#038;hw);

Lastly, golang got so much right in so many ways but the GC - can&#039;t have pauses in critical medical devices.]]></description>
			<content:encoded><![CDATA[<p>The have already tweeted the following:</p>
<p>This is why I like the way Go deals with member functions. It is a good compromise in the sense that you get clean data structures to share and reason about with the benefits of function fluidity, code reuse, in addition to a convenient mechanism for operating on that data without the rigidity of C++ member function. An example can be found here: </p>
<p><a href="https://golang.org/ref/spec#Method_expressions" rel="nofollow ugc">https://golang.org/ref/spec#Method_expressions</a></p>
<p>I use strictly C in the embedded space and I get real tired of the following pattern:</p>
<p>struct hardware;<br />
struct hardware_ops{<br />
	int (*read)(struct hardware *hw);<br />
};</p>
<p>struct hardware{<br />
	char data[MAX_DATA_SIZE];<br />
	struct hardware_ops ops;<br />
};</p>
<p>static int hardware_read(struct hardware *hw)<br />
{<br />
	return 0;<br />
}<br />
void hardware_init(struct hardware *hw)<br />
{<br />
 	hw-&gt;ops.read = hardware_read;<br />
}</p>
<p>struct hardware hw;<br />
hardware_init(&amp;hw);</p>
<p>/* Just to do this: */<br />
hw.ops.read(&amp;hw);</p>
<p>Lastly, golang got so much right in so many ways but the GC &#8211; can&#8217;t have pauses in critical medical devices.</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		By: billy_ninja		</title>
		<link>https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8426573</link>

		<dc:creator><![CDATA[billy_ninja]]></dc:creator>
		<pubDate>Sat, 12 Sep 2015 23:53:32 +0000</pubDate>
		<guid isPermaLink="false">https://the-witness.net/news/?p=3085#comment-8426573</guid>

					<description><![CDATA[It is such a pain, when programming comes to be about conform to rigid, massive API&#039;s, and worst of all &quot;Frameworks&quot; (at this point it doesn&#039;t feel like programming at all).

Recently I figured out that OOP is kinda BS, and I&#039;m unlearning it. Golang has been great for me on that matter (I&#039;m using it in both work and in a toy project).

Recently I&#039;ve been assigned in a task, and for it&#039;s nature it was well suited to Python (&quot;company&#039;s native language&quot;). At some point a &quot;Object pattern&quot;
started to appear heavily, and I said: &quot;Ok. time to be mature and reasonable and take advantage of some real OOP, and put aside my recent feelings about it&quot;. At the first couple days it was all great, and the more functionality I stuffed on my &quot;main object&quot; the easier thinks became, but didn&#039;t took long before it started to smell.

This should be really obvious but: This kind of tight coupling start to fall apart when you have to change things more deeply. You usually have to that once in awhile, unless you&#039;re doing BigDesignUpFront (which is another counter-productive pain in the ass in most contexts).]]></description>
			<content:encoded><![CDATA[<p>It is such a pain, when programming comes to be about conform to rigid, massive API&#8217;s, and worst of all &#8220;Frameworks&#8221; (at this point it doesn&#8217;t feel like programming at all).</p>
<p>Recently I figured out that OOP is kinda BS, and I&#8217;m unlearning it. Golang has been great for me on that matter (I&#8217;m using it in both work and in a toy project).</p>
<p>Recently I&#8217;ve been assigned in a task, and for it&#8217;s nature it was well suited to Python (&#8220;company&#8217;s native language&#8221;). At some point a &#8220;Object pattern&#8221;<br />
started to appear heavily, and I said: &#8220;Ok. time to be mature and reasonable and take advantage of some real OOP, and put aside my recent feelings about it&#8221;. At the first couple days it was all great, and the more functionality I stuffed on my &#8220;main object&#8221; the easier thinks became, but didn&#8217;t took long before it started to smell.</p>
<p>This should be really obvious but: This kind of tight coupling start to fall apart when you have to change things more deeply. You usually have to that once in awhile, unless you&#8217;re doing BigDesignUpFront (which is another counter-productive pain in the ass in most contexts).</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		By: Daniel Ribeiro		</title>
		<link>https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8426533</link>

		<dc:creator><![CDATA[Daniel Ribeiro]]></dc:creator>
		<pubDate>Sat, 12 Sep 2015 22:38:08 +0000</pubDate>
		<guid isPermaLink="false">https://the-witness.net/news/?p=3085#comment-8426533</guid>

					<description><![CDATA[Haskell has an interesting take on this with typeclasses, Clojure with multi-methods, and Objctive-C less interesting with Categories.

The idea is: allowing types to be extensible, and to use functions on them by properly controlling a static namespace. Theferore they feel likes functions, but they are polymorphic on the objects type (or with multi-methods, of the type of all or any of the arguments).

Worthy mention: Prolog replaces this with whole notion with unification, which is a more general and powerful concept than patter matching / ad-hoc polymorphism (it is aslo a lot harder to reason and implement).]]></description>
			<content:encoded><![CDATA[<p>Haskell has an interesting take on this with typeclasses, Clojure with multi-methods, and Objctive-C less interesting with Categories.</p>
<p>The idea is: allowing types to be extensible, and to use functions on them by properly controlling a static namespace. Theferore they feel likes functions, but they are polymorphic on the objects type (or with multi-methods, of the type of all or any of the arguments).</p>
<p>Worthy mention: Prolog replaces this with whole notion with unification, which is a more general and powerful concept than patter matching / ad-hoc polymorphism (it is aslo a lot harder to reason and implement).</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		By: Aidan Cully		</title>
		<link>https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8426521</link>

		<dc:creator><![CDATA[Aidan Cully]]></dc:creator>
		<pubDate>Sat, 12 Sep 2015 22:14:33 +0000</pubDate>
		<guid isPermaLink="false">https://the-witness.net/news/?p=3085#comment-8426521</guid>

					<description><![CDATA[I think what you&#039;re getting at is the &quot;expression problem&quot; - see https://en.wikipedia.org/wiki/Expression_problem . In functional languages, you often fix the data type and allow defining new operations against the data, while in OO languages you often fix the operations, and allow defining new data types that can implement the operation. Allowing extension in both operations and data at once is difficult...]]></description>
			<content:encoded><![CDATA[<p>I think what you&#8217;re getting at is the &#8220;expression problem&#8221; &#8211; see <a href="https://en.wikipedia.org/wiki/Expression_problem" rel="nofollow ugc">https://en.wikipedia.org/wiki/Expression_problem</a> . In functional languages, you often fix the data type and allow defining new operations against the data, while in OO languages you often fix the operations, and allow defining new data types that can implement the operation. Allowing extension in both operations and data at once is difficult&#8230;</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		By: msi		</title>
		<link>https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8426466</link>

		<dc:creator><![CDATA[msi]]></dc:creator>
		<pubDate>Sat, 12 Sep 2015 20:16:03 +0000</pubDate>
		<guid isPermaLink="false">https://the-witness.net/news/?p=3085#comment-8426466</guid>

					<description><![CDATA[If I get the sentiment right, your problem is that code reuse is hampered by the rigid data structures (really, data layout in memory) functions and methods are designed around.
The solution to this problem in C++, Rust etc. is generic functions. Although ideally, they should be combined with &quot;concepts&quot; to allow the compiler to check proper usage. What You&#039;re suggesting - disconnecting algorithms from data structures - is already possible, if at times unwieldy. Is this the problem You&#039;re after?]]></description>
			<content:encoded><![CDATA[<p>If I get the sentiment right, your problem is that code reuse is hampered by the rigid data structures (really, data layout in memory) functions and methods are designed around.<br />
The solution to this problem in C++, Rust etc. is generic functions. Although ideally, they should be combined with &#8220;concepts&#8221; to allow the compiler to check proper usage. What You&#8217;re suggesting &#8211; disconnecting algorithms from data structures &#8211; is already possible, if at times unwieldy. Is this the problem You&#8217;re after?</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		By: Alan deLespinasse		</title>
		<link>https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8426453</link>

		<dc:creator><![CDATA[Alan deLespinasse]]></dc:creator>
		<pubDate>Sat, 12 Sep 2015 19:56:56 +0000</pubDate>
		<guid isPermaLink="false">https://the-witness.net/news/?p=3085#comment-8426453</guid>

					<description><![CDATA[Are you actually arguing against data abstraction in general? That surprises me. Maybe I&#039;m misunderstanding.

 A Vector3 is a very simple case. It&#039;s unlikely to ever consist of anything but 3 numbers, probably indexed as 0, 1, and 2. And any three numbers make a legal vector, and callers probably want to access the individual numbers, so you might as well let them (though you might want to make them read-only). But for anything much more complicated, if you just let all callers access the raw data without imposing some rules, you&#039;re asking for trouble. (Sorry to be so vague; don&#039;t have time to write an essay on the reasons for data abstraction.)

Not that I think you should always impose strict abstraction on every data object. There are different considerations for every project.]]></description>
			<content:encoded><![CDATA[<p>Are you actually arguing against data abstraction in general? That surprises me. Maybe I&#8217;m misunderstanding.</p>
<p> A Vector3 is a very simple case. It&#8217;s unlikely to ever consist of anything but 3 numbers, probably indexed as 0, 1, and 2. And any three numbers make a legal vector, and callers probably want to access the individual numbers, so you might as well let them (though you might want to make them read-only). But for anything much more complicated, if you just let all callers access the raw data without imposing some rules, you&#8217;re asking for trouble. (Sorry to be so vague; don&#8217;t have time to write an essay on the reasons for data abstraction.)</p>
<p>Not that I think you should always impose strict abstraction on every data object. There are different considerations for every project.</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		By: Pritchard		</title>
		<link>https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8426451</link>

		<dc:creator><![CDATA[Pritchard]]></dc:creator>
		<pubDate>Sat, 12 Sep 2015 19:51:02 +0000</pubDate>
		<guid isPermaLink="false">https://the-witness.net/news/?p=3085#comment-8426451</guid>

					<description><![CDATA[This seems obvious.  I haven&#039;t read any of Bjarne Stroustrup&#039;s work, unfortunately, so I can&#039;t really discuss it.  The modern object model has become a de facto standard in business applications for defining these relationships.  Concepts have been slightly modified or extended to support defining contracts and APIs between services.

I believe that your APIs do matter, and that the way things are expressed does matter.  I also don&#039;t buy into the idea that I shouldn&#039;t need to know how anything works under the hood, because more often than not, that&#039;s where the actually difficult problems lie.

I think OOP and OOD has largely been a failure, and rigidly and inflexibility provides certain relationship or expressive mechanisms which some people find useful.  I haven&#039;t followed your language enough to comment much further, and my language design experience is next to none, but I&#039;m not opposed to closures and some alternative means to OO-mess to establishing contracts between data and processing algorithms.]]></description>
			<content:encoded><![CDATA[<p>This seems obvious.  I haven&#8217;t read any of Bjarne Stroustrup&#8217;s work, unfortunately, so I can&#8217;t really discuss it.  The modern object model has become a de facto standard in business applications for defining these relationships.  Concepts have been slightly modified or extended to support defining contracts and APIs between services.</p>
<p>I believe that your APIs do matter, and that the way things are expressed does matter.  I also don&#8217;t buy into the idea that I shouldn&#8217;t need to know how anything works under the hood, because more often than not, that&#8217;s where the actually difficult problems lie.</p>
<p>I think OOP and OOD has largely been a failure, and rigidly and inflexibility provides certain relationship or expressive mechanisms which some people find useful.  I haven&#8217;t followed your language enough to comment much further, and my language design experience is next to none, but I&#8217;m not opposed to closures and some alternative means to OO-mess to establishing contracts between data and processing algorithms.</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		By: ochre		</title>
		<link>https://the-witness.net/news/2012/09/a-note-about-programming-language-design/comment-page-1/#comment-8426442</link>

		<dc:creator><![CDATA[ochre]]></dc:creator>
		<pubDate>Sat, 12 Sep 2015 19:31:52 +0000</pubDate>
		<guid isPermaLink="false">https://the-witness.net/news/?p=3085#comment-8426442</guid>

					<description><![CDATA[i absolutely agree with your sentiments about methods, in my language though i used the familiar method-like syntax (kind of an expansion of golang&#039;s receiver argument) for a totally different purpose, and in the process saved some syntax elsewhere (const refs and ptrs). you can define a func like this:

func (i32 by_ref_arg1, i32 by_ref_arg2)my_func(i32 by_val_arg1, i32 by_val_arg2) {...}

so at the call site it&#039;s clear which args could be modified by the function, and which are read-only:

(a, b).my_func(2, 4)]]></description>
			<content:encoded><![CDATA[<p>i absolutely agree with your sentiments about methods, in my language though i used the familiar method-like syntax (kind of an expansion of golang&#8217;s receiver argument) for a totally different purpose, and in the process saved some syntax elsewhere (const refs and ptrs). you can define a func like this:</p>
<p>func (i32 by_ref_arg1, i32 by_ref_arg2)my_func(i32 by_val_arg1, i32 by_val_arg2) {&#8230;}</p>
<p>so at the call site it&#8217;s clear which args could be modified by the function, and which are read-only:</p>
<p>(a, b).my_func(2, 4)</p>
]]></content:encoded>
		
			</item>
	</channel>
</rss>
