X



Lisp Scheme Part40 [転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん垢版2015/03/16(月) 13:45:52.92ID:EEYZoZ1i
Common Lisp、SchemeをはじめとするLisp族全般のスレです

■前スレ
Lisp Scheme Part39
http://peace.2ch.net/test/read.cgi/tech/1408017352/

■テンプレ
ttp://wiki.fdiary.net/lisp/

■関連スレ
【入門】Common Lisp その11【質問よろず】
http://peace.2ch.net/test/read.cgi/tech/1411307361/
【Scheme】Schemeインタプリタ Mosh Part1【Lisp】
http://peace.2ch.net/test/read.cgi/tech/1272469779/
【Lisp】プログラミング言語 Clojure #3【JVM】
http://peace.2ch.net/test/read.cgi/tech/1380333808/
【魔法】リリカル☆Lisp【言語】
http://peace.2ch.net/test/read.cgi/tech/1183396621/
0517デフォルトの名無しさん垢版2017/04/02(日) 12:22:30.38ID:aBxOBDdQ
通常のletのように使うだけでgensym済みのlet文を生成するマクロ用コードを作ったのですが、このような挙動をする関数名を教えてください。
(let ((foo (gensym))) `(let ((,foo ,x)) ...)

(my-let* ((foo x)) ...)
と書ける感じです。再発明でなく役立つのであればここにCC0で貼りたいです。
0520デフォルトの名無しさん垢版2017/04/02(日) 13:06:11.52ID:aBxOBDdQ
突然死しないうちにとりあえず貼りますね。
アカウントは消すのでいいものであればbase64で書き残します。
ttps://gist.github.com/lla/f9244aefb7eee18db4cd
0522デフォルトの名無しさん垢版2017/04/03(月) 10:05:01.53ID:+t4V64u5
こういう時に要ると思うのですが...。要りませんか?
ttp://www.sampou.org/scheme/t-y-scheme/t-y-scheme-Z-H-10.html#node_sec_8.2
0525デフォルトの名無しさん垢版2017/04/03(月) 21:45:51.66ID:hrRYx8PC
schemeでは衛生マクロを使うので不要だと思います。
commonlispでも仕様が中途半端なので不要だと思います。
そのまま書くのと手間が変わらないですし。
0526デフォルトの名無しさん垢版2017/04/04(火) 12:16:18.07ID:ugpuQ2R8
バカにマクロは無理だと何度
0527デフォルトの名無しさん垢版2017/04/04(火) 16:11:24.87ID:L5RxkvgF
(define-macro (my-or a b) `((lambda (x y) (if x x y)) ,a ,b))

>>524 こうですか? 副作用に対してはより良いと思いますが、関数化した時lambdaが二重になって連続使用した時嬉しくないと思います。

>>525 仕様が中途半端という点、gensymのプレフィックスがないこと以外で何か不都合の起きる文があれば知りたいです。それともgensym名の変数は込み入った文や副作用でセットすることが多く、最初に全てのシンボルに値を入れられると不便ということでしょうか?
 ネストが一つ減る程度の関数は不要ですか?
0530デフォルトの名無しさん垢版2017/04/04(火) 22:10:42.70ID:QobCLqKi
>>527 once-only っていう定番マクロしらないの?
(defmacro square (x) (my-let* ((g x)) `(* ,g ,g)))
(defmacro square (x) (once-only (x) `(* ,x ,x)))
それは中途半端なonce-onlyの再発明なんよ
0531デフォルトの名無しさん垢版2017/04/05(水) 11:30:15.85ID:must9X5J
and や orって短絡評価な気がして>>527はもやもやする
それと副作用のある式を同一式に並べるのは未定義だった気がする
0532デフォルトの名無しさん垢版2017/04/05(水) 11:40:21.51ID:0wF5qf+D
>>530
素敵です! ありがとうございます! これが探し求めていたものです。より良いものがあることを願っていました。
0534デフォルトの名無しさん垢版2017/04/05(水) 12:49:06.15ID:must9X5J
((a b c) d)の評価順序は
a b cの順序は決まってなくて(a b c)の後にdが評価されるのだけは保証されている。で合ってるよね?
もちろんマクロや特殊形式の引数は除外だけど>>527の展開結果は(a b c)と同じことになってる

さらに(or a b c)ならaがtrueの時点で評価打ち切りでb cは評価されない(短絡評価)
(or a b c)がマクロなら以下のように展開されないといけない
((lambda(x k) (if x x (k))) a (lambda() ((lambda(x k) (if x x (k))) b (lambda() c))))
0535デフォルトの名無しさん垢版2017/04/05(水) 12:51:42.98ID:must9X5J
>a b cの順序は決まってなくて(a b c)の後にdが評価されるのだけは保証されている。で合ってるよね?
これ合ってないわ。評価されるからそれを見越して>>534の最後のように遅延評価を入れとくって話
もういいです。
0536デフォルトの名無しさん垢版2017/04/05(水) 12:59:10.45ID:must9X5J
評価されるから、じゃなくて評価の順序が決まってないから
それを見越して無引数lambdaを1つ挟む必要があるだった。
0537デフォルトの名無しさん垢版2017/04/05(水) 13:01:01.45ID:must9X5J
気持ち悪いからまとめると、
((a b c) d)のa b c dの評価順序は何も決まってないから気をつけてねって事。
0538デフォルトの名無しさん垢版2017/04/05(水) 15:11:50.69ID:I9ofuKtd
最初の要素を最初に評価しないとマクロかどうか分からないかと思ってたが、その前の段階でマクロかどうかを判断することができるらしいんで、仕様では決まってないのか
((begin (display "1st\n") +) (begin (display "2nd\n") 2) (begin (display "3rd\n") 3))
をchezとgaucheで評価したら
2nd
3rd
1st
5
って順番だった。guileやchickenだと
1st
2nd
3rd
5
って順番になる。
0539はつみつ餃子 ◆8X2XSCHEME 垢版2017/04/05(水) 16:19:09.69ID:Paj3QjV7
最適化や諸々の都合で、同じ処理系でも順序が変わることはあるので、
単純な事例だけでは処理系の性質を推し量ることは出来ない。
0540デフォルトの名無しさん垢版2017/04/05(水) 17:06:07.45ID:0wF5qf+D
(define-macro (my-once-only1 x . body)
(let1 tmp (gensym)
`(glet1 ,tmp ,x
(let1 ,x ,tmp ,@body) )))

(use srfi-1)
(define-macro (my-once-only vars . body)
(let ((names (map (lambda (_) (gensym)) vars)) )
`(glet* ,(zip names vars)
(let ,(zip vars names) ,@body)
) ))
念願のものが作れました…。これで心残りはありません。
0542デフォルトの名無しさん垢版2017/04/06(木) 03:23:23.24ID:A4tBLGW+
>>533
> >>531
> 確か評価順が未定義なだけ。

少なくともSchemeではandやorでの式の評価順序は未定義でなくは左から順番に評価すると一意的に規定されているぞ
CLはどうだが知らんが
0544デフォルトの名無しさん垢版2017/04/06(木) 16:32:44.68ID:R/lK+iME
やっとリスト処理に慣れてgensymであーだこーだしてる人にsyntax-rulesは敷居高いと思う
0546デフォルトの名無しさん垢版2017/04/06(木) 18:46:00.39ID:b3KdhuXf
むしろSchemeから学ぶとマクロ入門にはsyntax-rulesしか書いてなくてdefine-macro&gensym触る機会が無かった
0549デフォルトの名無しさん垢版2017/04/13(木) 16:03:04.54ID:RXvGitp8
>>546
> むしろSchemeから学ぶとマクロ入門にはsyntax-rulesしか書いてなくてdefine-macro&gensym触る機会が無かった

>>547
> 伝統的マクロの方が動作モデルを想像しやすくはあるかもね。

Schemeの場合、何でもありのマクロを排除して意味や動作を形式的に定義でき、
展開結果の正しさ(変数が展開したとたんに突然バインドされたりしない等)を保証できる範囲に留めたいという発想が
根底にあるからね

だからsyntax-rulesなどSchemeでの「マクロ」はあくまでも構文の拡張(カスタマイズ)のためなんだよね
つまり字句レベルを勝手に弄らせるとどんなトラブルでも起こし得るから勝手に弄らせたくたくない、
プログラマがお好みの構文を既存構文を使って定義して追加したいというならそれは許してあげよう
(例えばCみたいにwhile文…ループ条件の判定が最初に行われる構文…がある言語にrepeat〜until文を追加したいなら
許してあげように相当)というのがSchemeの基本的なスタンス

つまり、Schemeの場合はソースレベル(テキストレベルと言っても良い)で好き勝手な操作を許す本来のマクロ
(ソースコードレベルのメタプログラミング手段)でなくて、抽象構文レベルでの変換規則を定義し使用する範囲だけに
限定しているんだと考えれば良いと個人的には思ってるけどね

だから(メタ)プログラムの動きで理解するタイプの人(プログラマには多い、特に優秀な人ほど)にとっては
古典的なマクロのほうが却って理解しやすく、逆に理屈が好きで系統的に理解したがる(代わりにプログラムの腕は
さほどでないのが多い)人間にはSchemeの構文拡張のほうが理解しやすくそちらを好む人が多い

もっともsyntax-rulesとかを提案して実現した向うの連中はプログラミングの腕力も上級者以上ばかりだけどね
(でも殆どの凡人は、プログラミングの腕か理屈かの高々どちらかしか得意でない、まあだからこそ凡人なわけでして
どっちも両立できちゃったらGuy Steele, Jr.みたいになれちゃうよね)
0550デフォルトの名無しさん垢版2017/04/13(木) 16:37:53.95ID:UOOoC4Ge
syntax-rulesの動きがよくわからなくて理解できなかったけど古典的マクロなら単純で理解しやすかったな、準クォート使えば面倒でもなかったし(プログラムの腕はだめです)
0552デフォルトの名無しさん垢版2017/04/14(金) 01:29:59.73ID:ktX2OX7O
>>551
他のLispに限らずマクロは構文の拡張と言えるほどの系統的な代物にはなってないでしょ
だからマクロを展開した途端にグローバルだったはずの変数が束縛されてローカルな変数に化けたりする(変数のキャプチャね)
つまり通常のマクロは(必要に応じて実行時と同じ計算も許して)ソーステキストという文字列データを処理しているだけ

それに対してsyntax-rulesなどに代表されるSchemeのは抽象構文上での操作とすることでテキストという文字でなく構文の句構造のレベルで扱い
変数のキャプチャなどを起こさないように保証するわけだ

ソースコードを文字データとして処理するのか句構造として処理するのかでは考え方も保証できる正しさや展開の安全性も全く違う
0553デフォルトの名無しさん垢版2017/04/14(金) 02:55:56.83ID:f5XItAeI
>>552
> lispマクロは構文の拡張と言えるほどの系統的な代物にはなってない.
そんなお前定義しらんし,そんならsyntax-rulesも違う.
はなしが無限退行しそうだからもういいわ.
0555デフォルトの名無しさん垢版2017/04/14(金) 07:39:01.84ID:a6xDhPFv
さあ、わかんなくなってきました。
とにかくsyntax-rulesの方が高級で、実装がめんどくさくて、低機能で、とりあえずほとんどの用はたりる。
0556デフォルトの名無しさん垢版2017/04/14(金) 20:02:05.16ID:E0l2Apap
そのめんどくさいの一点だけでLISP系にsyntax-を導入する価値は微妙
パターンマッチだからLISPじゃなくていいわけよね
syntax-rule/caseを日本語で詳細解説した本とかWebページってない?
0557デフォルトの名無しさん垢版2017/04/14(金) 20:06:23.95ID:E0l2Apap
なんだっけsyntax-rule/caseの他にもう2つぐらい別種があるんだよね
重複しないシンボル名の管理の観点では手間は同じだけど概念的にはより簡単な感じだったと思う
0559はつみつ餃子 ◆8X2XSCHEME 垢版2017/04/15(土) 11:21:48.74ID:7hkWD0i5
>>556
> そのめんどくさいの一点だけでLISP系にsyntax-を導入する価値は微妙

一概には言えない。
たとえば letrec のようなものをマクロで書こうとするとフォームを分解したり
衛生的にしたりする処理はいずれにしても必要なことで、
それを自動的にやってくれる syntax-rules だと簡単に書ける。

syntax-rules や syntax-case は言語のプリミティブな機能としては高級すぎるのは確かで、
これは低水準の部分でどのパラダイムを採用するかで意見が一致しなかった末の妥協案として
いきなり高級な機能を持ち込んだ結果。

参考: http://blog.practical-scheme.net/shiro?20100425-scheme-macro

実際の処理系では explicit renaming や syntactic closure を基礎に据えてその上に
syntax-rules や syntax-case のインターフェイスを実装している場合もよくある。
0560デフォルトの名無しさん垢版2017/04/15(土) 15:50:40.85ID:HoujqO6s
schemeだとread macroの定義ってどないなっとるん?
自分common lispとバージョンが上がるといつ消えるか解らないclojureのしか知らんのだけど。
0561はつみつ餃子 ◆8X2XSCHEME 垢版2017/04/15(土) 16:38:57.94ID:7hkWD0i5
>>560
リードマクロについては Scheme の仕様には含まれないし SRFI にもないし、デファクトスタンダードといえるものもない。
処理系が独自にやっている場合はあるけど。

私見だが、 Common Lisp に比べて Scheme はモジュール化を強く意識していると思う。
R6RS でフェイズの制御について一応の考え方が確立したものの、
リーダの適用範囲をうまく制御するにはまた別の軸を持ち込む必要があるので厄介なのだと思う。
0562デフォルトの名無しさん垢版2017/04/15(土) 18:36:19.85ID:HoujqO6s
>>561
あ、やっぱりなかったのか探しても定義みつらんわけだ
DSL書きたいので処理系の小さい実装のschemeでやろうとおもったのだけど駄目か orz

ありがとね
0566デフォルトの名無しさん垢版2017/05/20(土) 21:49:25.89ID:hZyWUkTA
Lispの論文で英語表現とか定理の書き方みたいので参考になる論文ってどこらへんみればいいでしょう
0569デフォルトの名無しさん垢版2017/05/24(水) 08:06:22.98ID:HxetDgQ4
>>564
リードテーブルの状態によってプログラムの意味が変わってしまうのは不健全さを嫌うScheme的にはだめでしょ
0576はつみつ餃子 ◆8X2XSCHEME 垢版2017/05/28(日) 17:36:39.82ID:KnUhHSDN
Chez Scheme について具体的に知りたいことがあればここで質問すれば簡単な回答くらいはつくかも?
0580デフォルトの名無しさん垢版2017/06/11(日) 12:44:37.67ID:QmG4H1RB
逆転ポインタなつい
ttp://qiita.com/kingshine/items/d74576886c067737ad18
0581デフォルトの名無しさん垢版2017/06/22(木) 00:41:06.63ID:qjVInUD2
Common lispのnilとfalse区別しないの気持ち悪いけど
Schemeでまともな処理系もう残ってない感じして
Common Lisp に移住するしかない
0583はつみつ餃子 ◆8X2XSCHEME 垢版2017/06/24(土) 01:00:13.24ID:Ma6ZsMvR
>>577-578
Kahua ほどダイナミックな運用はできないが Gauche-makiki は簡単に使えるし
活発に更新されているのでいいかも。
0585デフォルトの名無しさん垢版2017/06/29(木) 22:55:19.10ID:S64gSu9X
忌マラン
0597デフォルトの名無しさん垢版2017/07/07(金) 01:47:32.06ID:2HLO6jqr
実際のところSchemeでどんなプログラム書いてる?
具体的に晒せるものがある人いる?
0598デフォルトの名無しさん垢版2017/07/07(金) 11:18:37.71ID:jxDw4Nqu
晒せないが、S式で書いたテンプレートからHTMLに変換してた
CSSで過去の技術となったが

あとはC++に組み込みスクリプト
0601デフォルトの名無しさん垢版2017/07/07(金) 21:29:14.88ID:tdv0VtnU
>>599
そもそも盛り上ってないこのスレを盛り上げるにはお前が身を削ってネタ投下するしかないだろ
0606はちみつ餃子 ◆8X2XSCHEME 垢版2017/07/21(金) 02:42:10.26ID:2BokDUmp
Python ってプログラマでない人にも使いやすいデザインなんだとさ。
数学屋や物理屋もプログラムを書くことはあるけど、専門家じゃないからな。
言語に関わってばかりはいられん。
綺麗な抽象化とか考えずに愚直に書いて動くってのはそれはそれで良い言語なんだよ。
VB とかな。

AI の核になるライブラリが出そろってきていろんな応用をする段階になると
Python の方が色んな人に使ってもらえるという意味で良いんじゃないか?

それに今の AI ってのは記号処理するのに柔軟なデータ構造が必要って感じじゃないだろ。
計算量を投入しまくって結果を出す機械学習とかじゃん。
広い意味では AI つってもやってることは違うよ。
0607デフォルトの名無しさん垢版2017/07/28(金) 00:10:04.60ID:Hpt0wAEo
Schemeが本当に美しさと強さを両立させようと思うんなら
速さを二の次にして仮想機械の仕様も標準に入れてしまえばよかった
Smalltalk-80のVMは美しかったが
RnRSのdenotational semanticsの記述はCOBOLのコードみたいで正直読みたくない
0608はちみつ餃子 ◆8X2XSCHEME 垢版2017/07/28(金) 20:26:39.53ID:hXOq69kK
Scheme の仕様ってのは業務マニュアルみたいなもんだよ。
たとえば「誰にハンコをもらえば進めていいのか?」みたいな手順は組織の秩序としてやらなきゃならないことだから
個人の創造性で決めれることじゃないし、仮にそれぞれの場面で最高の才能を発揮して根回ししたところで
正事の成果が良いものになるわけじゃない。
どうでもいいことはマニュアル通りにやってもっと大したことに力を入れようってのが業務マニュアルだろ。
逆に言えば創造の余地がある部分は決めつけてしまいたくないんだ。
0609デフォルトの名無しさん垢版2017/07/29(土) 16:28:59.88ID:hKWXJ4tB
lispworks 32bitを使ってて、fliを使ってwindowsのdllから関数を呼ぼうとするのだけど、
一部の関数だけがunresolved symbolだと言われて呼び出せない。
dll exported functipn viewerとかでみてみると、
ちゃんと関数を確認できるのに。

何でかわかる人いる?
おいどん、初心者やからわけわかめなのよ。

とりあえず、cffiでもできないかどうかと、ほかの処理系ではどうかを試そうとは思うのだけど、
なんか知ってる人いたら助けてー
0610はちみつ餃子 ◆8X2XSCHEME 垢版2017/07/29(土) 17:59:53.12ID:HavpCAcr
>>609
呼び出せなかったのは具体的にどの関数?
確認した範囲で呼び出せている関数も書いてもらえれば
何か違いを見出せるかも
0611デフォルトの名無しさん垢版2017/07/30(日) 08:44:30.09ID:b5TorD0f
>>610
windowsのdllってのは適切な言い方じゃなかったかも。
具体的には、趣味で下記のライブラリをlispworks上で使いたいと思っているんです。

ttp://www.astro.com/swisseph/swephinfo_e.htm
ttp://www.astro.com/ftp/swisseph/

ここのsweph.zipにWindows 32bit用のdllがあるのですが(swedll32.dll)、
lispworksのfliを使って呼び出そうとすと、呼び出せる関数と呼び出せないのがあるんです。

ただ、私、lispもcもwindowsプログラミングも素人なので、何が問題なのかもよくわかってません。

後ほど、呼び出せる、呼び出せない関数の例や、その定義等含め書いてみます。
なにかアドバイスありましたらいただけますと幸いです。
0612デフォルトの名無しさん垢版2017/07/30(日) 09:04:35.78ID:b5TorD0f
609です。
うまくいく例とダメな例を挙げてみます。おそらく皆さんは全く興味のないライブラリだと思うので、質問するのも恐縮ですが。

問題なく呼び出せる例:

CL-USER 1 > (fli:register-module "swedll32.dll")
"swedll32.dll"

CL-USER 2 > (fli:define-foreign-function (swe_julday "_swe_julday@24" :source) ((year :int) (month :int) (day :int) (hour :double) (gregflag :int)) :result-type :double)
SWE_JULDAY

CL-USER 3 > (swe_julday 2001 1 1 0d0 1)
2451910.5D0

CL-USER 4 > (fli:define-foreign-function (swe_calc_ut "_swe_calc_ut@24" :source)
??? ((tjd_et :double) (ipl :int) (iflag :long) (xx (:reference-return (:c-array :double 6))) (serr? (:reference-return (:ef-mb-string :limit 256))) ) :result-type :int :lambda-list (tjd_et ipl iflag &aux? xx? serr))
SWE_CALC_UT

CL-USER 5 > (swe_calc_ut (swe_julday 2001 1 1 0d0 1) 0 0)
4
#<Foreign-Array :DOUBLE (6): addr #x02189F08>
"SwissEph file 'sepl_18.se1' not found in PATH '\\sweph\\ephe\\'
using Moshier eph.; "
0613デフォルトの名無しさん垢版2017/07/30(日) 09:08:14.26ID:b5TorD0f
今度はダメな例です。

CL-USER 6 > (fli:define-foreign-function (swe_version "_swe_version@4" :source) ((sver (:reference-return (:ef-mb-string :limit 256)))) :result-type :pointer :lambda-list (&aux sver))
SWE_VERSION

CL-USER 7 > (swe_version)
Error: Foreign function SWE_VERSION trying to call to unresolved external function "_swe_version@4".
? 1 (abort) Return to level 0.
? 2 Return to top loop level 0.
Type :b for backtrace or :c <option number> to proceed.
Type :bug-form "<subject>" for a bug report template or :? for other options.


CL-USER 8 : 1 > :c 1

CL-USER 9 >

一応、自分なりに調べてソースファイルからdefファイル使ってコンパイルしなおしたりもしたのですが、
やはりだめでした。もっとも素人なので意図していることができているかどうかも怪しいのですが。。。

もし何かアドバイスありましたらお願いします。
0614デフォルトの名無しさん垢版2017/07/30(日) 09:13:00.89ID:b5TorD0f
612訂正

誤:

>CL-USER 4 > (fli:define-foreign-function (swe_calc_ut "_swe_calc_ut@24" :source)
>??? ((tjd_et :double) (ipl :int) (iflag :long) (xx (:reference-return (:c-array :double 6))) (serr? (:reference-return (:ef-mb-string :limit 256))) ) :result-type :int :lambda-list (tjd_et ipl iflag &aux? xx? serr))
>SWE_CALC_UT

不要な?がはいっちゃいました。


正:

CL-USER 4 > (fli:define-foreign-function (swe_calc_ut "_swe_calc_ut@24" :source)
((tjd_et :double) (ipl :int) (iflag :long) (xx (:reference-return (:c-array :double 6))) (serr (:reference-return (:ef-mb-string :limit 256))) ) :result-type :int :lambda-list (tjd_et ipl iflag &aux xx serr))
SWE_CALC_UT
0615609垢版2017/07/31(月) 10:20:59.29ID:EZDN6PLf
>>609です。自己解決しました。

defファイルを使ってソースファイルからコンパイルしなおしたら
問題なく呼び出せるようになりました。汗

これまでも何度かVisual Studioからコンパイルを試していて、
dllは問題なく作成されるものの、一部呼び出せない関数があり、問題は解決しませんでした。
しかし、今回コマンドラインからコンパイル、リンクすると、なぜかうまくいきました。


結局、何が問題だったのかはわからないのですが、
とりあえず利用で来るようになりましたので、ご報告です。

お騒がせしました。。
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況