関数が自由に出現するようなLispは可能か?

例として、(+ 1 1)が(1 + 1)、(+ 1 1)になるようなLisp処理系はあるのか、そしてもし作るとするならどういう風なことが考えられるのか。 識者の方がコメントをくださったのでまとめてみました。
2
似非原 @esehara

Lisp族言語に詳しい人に聞きたいのですが、処理系の特出上、関数が出現する位置が前置ではなくても、その出現位置によって上手く処理してくれるLispという発想は既に考案されていますか? 例:(+ 1 1)でも(1 + 1)でも(1 1 +)でも、評価自体は同じになるような

2016-05-23 05:53:31
Miura Hideki @miura1729

@esehara Lispを中値記法にする試みは山のようにあったでしょうが、関数の出現位置を自由にするのは高階関数が出来なくなるので、ほとんど無いのではないでしょうか?

2016-05-23 06:22:02
Shiro Kawai @anohana

@esehara 後置なら後置で統一したのはあったと思いますが全く自由というのは知らないです。ある意味日本語的? Gaucheで<number>等にメソッド生やして中置「も」可能にするってのは誰かがやってたのを見たことあります。

2016-05-23 07:00:54

高階関数をどうあつかうか

素朴に考えると、関数が自由に現れるといっても、引数に与えられる関数は、順番に依存してしまうのではないか

Miura Hideki @miura1729

@esehara Lispを中値記法にする試みは山のようにあったでしょうが、関数の出現位置を自由にするのは高階関数が出来なくなるので、ほとんど無いのではないでしょうか?

2016-05-23 06:22:02
似非原 @esehara

@miura1729 恐らく、ちょっとした制限として先に関数として出現したものを採用して、後に出てきた関数に関しては引数として処理する、みたいなので処理出来そうですが、こうすると、自由な関数の出現という原理にはちょっと離れることになりますね

2016-05-23 06:31:30
Shiro Kawai @anohana

@esehara 作ってみたんですが、第2引数に高階関数を取るオペレータでは結局順番を変えられないことに気づきました。(find fn lis)のfindを先頭から動かすと引数になるべきfnが最初に来てしまい、それがオペレータに。gist.github.com/shirok/e10f63a…

2016-05-23 07:13:57
Shiro Kawai @anohana

@esehara s/第2引数/第1引数/ でした

2016-05-23 07:15:55

Shiroさん(Kilo Kawai)さんによる、ジェネリックファンクションでの実装

プロトタイプを作ってくれました。感謝!

Shiro Kawai @anohana

@esehara これならどうかな gist.github.com/shirok/60aae4d… 高階関数は特殊な方法でクオートする(&)。並べ替えの時にクオートを「剥がして」やる。

2016-05-23 07:27:43
似非原 @esehara

@anohana これだと、Common Lispの#っぽいですね。下手に制限をかけるよりも、Lisp-2のように、引数の関数はあえて目印をつけたほうが、関数の自由な出現がより実現できそうですね。

2016-05-23 07:33:53

そのほかの意見

Masanori Ogino @omasanori

@esehara @miura1729 別の案として、日本語における格助詞のようにcalleeを指示する(またはcalleeでない手続きを指示する)記号を用意するという手も考えられますね。後者の例 (map :+ lst) = (:+ lst map)

2016-05-23 06:55:34
Masanori Ogino @omasanori

@esehara @miura1729 前者は常にfuncallが必要なCommon Lispのようなもので、後者は手続きに対して f != (quote f) ==(quote (quote f)) となるような特殊なクォートを導入するようなものになる?

2016-05-23 07:00:20
Miura Hideki @miura1729

@omasanori @esehara このクオートってCommon Lispの#'みたいなものだと思うのだけど、Lisp-1なのに#'が必要ってのも哀しい話だなと思いました。

2016-05-23 07:21:27

蛇足