【入門】CommonLisp【 ..
[2ch|▼Menu]
662:デフォルトの名無しさん
05/10/11 04:45:21
>>620
面白い物見つけた。

URLリンク(www.geocities.jp)

Socket 経由で GUI を作ってるっぽいけど、Windows Native でも
似た様なのがあるんじゃないかな。Mac だとこういうのがある。

URLリンク(www.bluem.net)

663:おしえて厨
05/10/11 08:49:23
(defun small (lis)
(cond ((null (rest lis))
lis)
((< (first lis) (first (rest lis)))
(remove (first lis) lis)
(remove (first (rest lis)))
(cons (first lis) lis)
(cons (first (rest lis) lis))
(small lis)
(t (small (rest lis))))))

↑バブルソートしたくて書いてみた。駄目だった。どこが駄目?

664:デフォルトの名無しさん
05/10/11 09:41:52
バブルソートを使うところが駄目。

665:デフォルトの名無しさん
05/10/11 10:13:57
(defun merge-sort (lst)
(let ((len (length lst)))
(cond ((< len 2) lst)
((= len 2)
(let ((x (car lst))
(y (cadr lst)))
(if (< x y) (list x y) (list y x))))
(t
(do ((x (merge-sort (butlast lst (ash len -1))))
(y (merge-sort (last lst (ash len -1))))
(r '()))
((or (null x) (null y))
(nconc (nreverse r) x y))
(push (if (< (car x) (car y)) (pop x) (pop y)) r))))))

666:おしえて厨
05/10/11 17:25:50
(remove 'a 'a)みたいに一文字だとremoveできないじゃん。
どうやって一文字しかないのを消すの?
あと、(a b c (a ((b))))みたいになってるときのbだけを消して、
(a b c (a (( ))))みたいにする方法って、あるの?

667:デフォルトの名無しさん
05/10/11 18:03:53
((lambda (x y)
((lambda (f) (funcall f f y))
(lambda (f y) (typecase y
(list (remove x (mapcar (lambda (y) (funcall f f y)) y)))
(t y)))))
'b '(a b c (a ((b)))))
=> (A C (A (NIL)))

668:おしえて厨
05/10/11 19:06:51
関数が定義されていません: typecase

669:デフォルトの名無しさん
05/10/11 19:36:09
そりゃ Common Lisp じゃないな。スレ違いだからもうこのスレに来ないように。

670:デフォルトの名無しさん
05/10/11 19:37:20
>>668
処理系がまがい物だな

671:デフォルトの名無しさん
05/10/11 20:10:17
xyzzy だな

672:おしえて厨
05/10/11 20:43:06
xyzzyなんだけど、typecaseつかわずにできないの???

673:デフォルトの名無しさん
05/10/11 21:12:30
>>672
xyzzy使いのよしみで回答しておくけど、
CommonLisp を勉強するのに xyzzy を処理系として使っちゃダメ。
xyzzy でマクロを書くための勉強ならここで質問するのは間違い。

((lambda (x y)
((lambda (f) (funcall f f y))
(lambda (f y) (if (listp y)
(remove x (mapcar (lambda (y) (funcall f f y)) y))
y))))
'b '(a b c (a ((b)))))
=>(a c (a (nil)))

674:おしえて厨
05/10/11 21:57:05
(defun del-atom (n lis)
(cond ((null lis)
nil)
((atom (first lis))
(cond ((eql n (first lis))
(del-atom n (rest lis)))
(t (cons (first lis) (del-atom n (rest lis))))))
((listp (first lis))
(cond ((listp (first (first (first lis))))
(cond ((eql n (first (first (first lis)))))
(del-atom n (rest lis)))
(t (cons (first lis) (del-atom n (rest lis))))))
(cond ((listp n (first (first lis)))
(cond ((eql n (first (first lis)))
(del-atom n (rest lis))))
(t (cons (first lis) (del-atom n (rest lis)))))))))



↑自分でもやってみようとしたら、こんなんなっちゃったよ〜〜〜〜
どこが駄目???

675:デフォルトの名無しさん
05/10/12 00:50:11
((listp (first lis))
(cons (del-atom n (first lis)) (del-atom n (rest lis))))

676:デフォルトの名無しさん
05/10/12 00:51:18
first とか rest って使われてるんだなぁとそちらのほうに感動してたりする俺。

677:デフォルトの名無しさん
05/10/12 17:12:58
>>676
それはね、「xyzzy Lisp Programming」のページで、first と rest を推奨す
る、と書かれているからだよ。
URLリンク(www.geocities.jp)


678:デフォルトの名無しさん
05/10/12 17:23:12
>>677
「first と rest を使うことが推奨されています」なんて書いてるが、「誰が」推奨
しているのか不明だな。少なくとも CLtL2 にも ANSI にもそんな記述は見あた
らないが。(もし見落としてたら教えてくれ)

679:おしえて厨
05/10/12 17:33:11
P.H.ウィンストンという人が書いた緑の本に推奨されていた。
まあそれはさておき675さんの指摘がよくわかりません。
どこを直せばいいの??

680:デフォルトの名無しさん
05/10/12 18:08:58
>>679
> どこを直せばいいの??
頭の中身。
お前さんは九九も覚えてないのに数学の問題を見てわからないとわめいてるの
と同じなので、677 が紹介してるサイトの Common Lisp 入門を全部読んで
理解してからもう一度いらっしゃい。

681:デフォルトの名無しさん
05/10/14 03:51:47
ウィンストンって培風館の奴か?

car,cdrの方が好き
ハード寄りで

682:デフォルトの名無しさん
05/10/14 11:14:21
>>681
いつの時代の方ですか?

683:デフォルトの名無しさん
05/10/14 12:23:03
平成17年

684:デフォルトの名無しさん
05/10/14 12:27:20
漏れも car cdr のほうが好きだが、さすがに IBM 7090 (だっけか)は使ったことない。

685:デフォルトの名無しさん
05/10/14 14:01:44
8月からLisp触り始めた超初心者だけど
car、cdrのほうが好きだな。

686:デフォルトの名無しさん
05/10/14 17:17:44
>>679,681
俺もその本持ってる。そのせいか first、rest 派。
自分では使わないから、car や cdr ならともかく caddr ぐらいでもわけわからん。

687:デフォルトの名無しさん
05/10/14 17:23:31
>>686
caddr と third とどっちがわかりやすいかだわな。
個人的には視覚的にわかる caddr のほうが好き。

688:デフォルトの名無しさん
05/10/14 22:48:16
nthは邪道ですか、そうですか

いや、俺も使わないけど

689:デフォルトの名無しさん
05/10/15 14:56:32
(nth 3 L) ≡ (fourth L) なのがなんとも

690:デフォルトの名無しさん
05/10/15 15:05:25
>>689
nth は aref とともに elt の特別版ということだな。
むしろ、この3つの中で nth だけ引数順が違うのが気になる。

691:デフォルトの名無しさん
05/10/16 18:18:47
ルプラカ ルプラクドゥ
パンプルピンプルパムポップン
カッドゥルゥァー
クックドゥー

692:デフォルトの名無しさん
05/10/18 22:37:29
オブラディ オブラダ
(・∀・)スンスンスーン

693:デフォルトの名無しさん
05/10/19 19:16:22
;;ある基点となるフォルダより下のフォルダのフルパスを全て取得するには再帰でどう書けばいいですか?

694:デフォルトの名無しさん
05/10/19 20:40:03
実装依存

695:デフォルトの名無しさん
05/10/19 20:42:51
xyzzyでは??

696:デフォルトの名無しさん
05/10/19 20:45:20
板違い

697:デフォルトの名無しさん
05/10/19 20:55:26
(directory PATHNAME) あたりで調べると良いかも。

698:デフォルトの名無しさん
05/10/21 00:53:04
ECL使って実現されているプロジェクトでそこそこの規模のやつって誰か知りません?
C/C++とCommon Lispを混ぜた開発したいんだけども、実際の使われ方を見て勉強した方が
理解が早いかなと思って。
それともUFFI使うのが定説ですかね。

699:デフォルトの名無しさん
05/10/21 01:37:09
どうなんだろう.最近は CFFI とかも出てきてるしねぇ.
まず Lisp 側のインターフェースを決めて,それが十分に抽象化できていれば
その下は UFFI だろうが処理系の FFI だろうがたぶん問題ない.

ECL はあんまり触ったことないので本題には答えられない.スマソ.
キーワードハイライトつきのエディタ作ったとか Planet Lisp に出てたような.

700:698
05/10/21 01:58:32
>> 699
ありがと。Planet Lisp行ってきます。
スレ違いって怒られるかも知れないけど、Gaucheとかだと結構事情が違ったりする?
確か開発目標に他の言語と仲良くするってのがあったような。でも最終的には
ネイティブコードで走らせたいんだよなぁ・・・

701:デフォルトの名無しさん
05/10/21 02:08:50
ネイティブコードってことは性能が欲しいの?
それでフリーなのがいいならCMUCLやSBCLがいいんじゃないかな。
Cの呼び出しやCからのコールバックもそれほど面倒じゃないし。

702:698
05/10/21 02:45:04
Planet Lisp行ってきました。
簡単なアナウンスだけ出ててsourceforgeに誘導されてみたらスクリーンショットも
公開されてました。CVS HEADにコードが入っているみたいなのでこれから調査します。

いまはプロトタイピングの段階なので実現可能性の検証が主体です。アルゴリズムの設計と
検証はLispであ〜でもないこ〜でもないやりながら考えた方がお手軽なのですが
プロジェクトの他のメンバがC/C++でコード書いてるので現状は

・Lispでアルゴリズム練る → C++で等価なコードを書いてリポジトリにチェックイン

してます。二度手間でアホらしいんですが最初からC++であれこれ書けないんですよ。
C++の汚さに辟易して大分昔に標準化の動向追いかけるのやめていたこともあって。
で、どうせならLispのコードそのままC/C++に埋め込んじゃうことはできないのかな〜と
たくらんでいるところです。


スレ違いになりますが最近STLやらBoostやらLokiやら勉強してみて驚愕しました。
何であんな大変な思いをしてまでC++使うんですかね・・・不思議でたまらん。

703:デフォルトの名無しさん
05/10/21 02:54:10
>>702
ずいぶんと怪奇なことになってるよね。>C++
でも、すべてインラインに開いちゃうから確かに速い。
そのかわりコードサイズが大爆発。w

704:デフォルトの名無しさん
05/10/25 00:24:33
今ポールグラハムのlisp本でお勉強中なのですが、lispでは
soketを開くとかプロセス制御するとか低レイヤな処理をする場合
どーすんのでしょうか。処理系にそうしたライブラリがなかったりする場合は?

705:デフォルトの名無しさん
05/10/25 00:34:49
socketです。typoっす。すんません。

706:デフォルトの名無しさん
05/10/25 01:12:37
>>704
どうにもなりません。そういうライブラリが存在するか、ネイティブコードを
呼ぶなどの方法でなんとかできる処理系を選びましょう。

707:704
05/10/25 01:53:21
>>706
むぅ。そういうもんなんですか。教えて頂いて有難うございます。
そういったことは一旦置いておくとすると、学習向けに
オススメの処理系があればご教授頂けると助かります。
今のところ本読んでるだけなのですが手続き型が染み付いた頭には
関数プログラミングって難しい…。

708:デフォルトの名無しさん
05/10/25 02:04:53
>>707
WindowsならCLISP、UNIX系ならSBCLがいいんじゃないかな。
どちらもソケットなどの拡張機能は持っているよ。

709:704
05/10/25 02:12:34
>>708
どもです。SBCLっての調べてみます。。

710:デフォルトの名無しさん
05/10/28 00:10:41
潜水艦から発射するミサイルじゃないの?

711:デフォルトの名無しさん
05/10/28 00:15:22
>>710
それはSLBM

712:デフォルトの名無しさん
05/10/28 01:26:06
コンパイラ・スクリプトエンジン相談スレで言語処理系の実装にLispを使うべきだ風な
書き込みを見掛けて興味を持ったのですが、具体的にLispで記述されたコンパイラとかで
参考になりそうなものがあれば教えていただけますか?ソースを見てどんな利点があるのか
比較してみたいです。大昔GCCのソースを眺めたとき内部でS式みたいので木を表現して
いたみたいでしたが、表現形式だけじゃなくて実際に内部でLispプログラムが動いてたり
するんだろか。

713:デフォルトの名無しさん
05/10/28 03:53:37
かつては MacLisp が Fortran と張り合っていたわけだし,今でも Lisp コン
パイラはほとんど Lisp で書かれているよ.ただ,Lisp 製の ML や C コンパ
イラとかもあるけど,入門で読むのは無理だろう.

利点としてはコンパイラを書く時にモロに Lisp コンパイラの機能がつかえる!!
といっても,何の事か Lisp を知らなければまったくイメージできないかもしれない.
だからまず Lisp を学ぶ必要があるとおもうよ.基礎を一通りやったあと,

URLリンク(groups.google.com)

とか見て,それでもメリットがわからないようなら Lisp の事は忘れたほうが
いい.合う合わないがあるからね.

714:デフォルトの名無しさん
05/10/28 20:14:18
MacLispか…研究室の物置に5”FDの認知心理のプログラム群があったなぁ

715:デフォルトの名無しさん
05/10/30 01:11:05
lispと他のプログラムとの構文とかの対比表ってありませんか?

716:デフォルトの名無しさん
05/10/30 03:33:47
MacLisp か…今やプロジェクト Mac の Lisp で Macintosh とは関係ないと
言わないと通じない時代かもしれんな…

717:デフォルトの名無しさん
05/10/30 06:51:32
URLリンク(kasamatusan.sakura.ne.jp)
(竹内)

718:デフォルトの名無しさん
05/10/30 11:34:43
>>715 他のプログラム言語,と言いたいのか?具体的には何よ?


719:デフォルトの名無しさん
05/10/30 14:47:52
>>718
C,C++,java,perl,ruby,python,PHPなどのメジャーな手続き型のどれか

720:デフォルトの名無しさん
05/10/30 16:39:07
>>719
Lisp プログラマのための Python 入門
URLリンク(www.unixuser.org)
こんな感じ?

721:719
05/10/30 16:54:13
>>720
thx!

722:デフォルトの名無しさん
05/10/30 19:46:03
>>716
Windows上で動く?

723:デフォルトの名無しさん
05/10/30 19:47:42
lispとjavascriptってどっちが優れていますか?

724:デフォルトの名無しさん
05/10/30 19:50:17
>>722
PDP-10 とか DEC System 20xx のエミュがあれば。

725:デフォルトの名無しさん
05/10/30 19:57:22
>>723
javascript は lisp です

726:デフォルトの名無しさん
05/10/30 23:48:45
煽りにもマジレスしておこうか.

Web のクライアントサイドスクリプティングなら圧倒的に JavaScript が優れている.

逆にサーバーサイドでの処理なら Lisp のほうが良いな.でも君が病的に括弧
を恐れているならどこでも JavaScript のほうが優れていると感じるだろう.
基準をしめさない場合,「どちらが優れていか?」というのは主観的な問題だ
から,人に聞いてもあまり意味がないよ.

727:デフォルトの名無しさん
05/10/31 03:19:26
>lispと他のプログラムとの構文とかの


728:デフォルトの名無しさん
05/11/01 00:04:26
>>716 Maclisp と綴って欲しい

729:デフォルトの名無しさん
05/11/01 06:11:42
Win32バイナリが吐けるLispコンパイラはどこですか?

730:デフォルトの名無しさん
05/11/01 07:05:14
>>726
主観なわけねーじゃん。ばっかじゃないの

731:デフォルトの名無しさん
05/11/01 10:46:25
>>730
基準をしめさない場合、という条件でどこをどうやったら主観じゃなくなるのだ?

732:デフォルトの名無しさん
05/11/01 11:35:21
>>730の次のレスは「あまりの恥ずかしさに煽って逃げる」これ。

733:デフォルトの名無しさん
05/11/01 12:11:48
>>729
コーマンリスプなんてどうだ。
URLリンク(www.cormanlisp.com)

734:デフォルトの名無しさん
05/11/01 12:54:47
非商用なら無料なんだ。
corman はチェックしてなかったな。結構寛容なライセンスだね。

735:デフォルトの名無しさん
05/11/01 13:34:49
どうせポップアップウィンドウに


        t


とか表示させるだけだろ

736:デフォルトの名無しさん
05/11/02 00:11:24
ロジャーコーマンは腹出過ぎ。

737:デフォルトの名無しさん
05/11/02 00:30:12
Corman Lispって日本語通るようになったのかな?
要望あったら聞くよーてなメールも送ってきたくらい個人商店ぽいので
誰か日本で使い物になるなら買うから是非頼むといってやれば
なんとかしてくれるかも。


738:デフォルトの名無しさん
05/11/02 00:31:55
[CommonLisp とコンパイル - コンパイラスクリプトスレからの続き]

つまり Lisp においては「x に 2 を倍する」プログラムはデータ構造 (* x 2) と表現できるわけだ.
(もし熱烈な C/C++ & XML ファンならこの構文木をつくってよう)
さて,ここで操作する.もし「x に 2 を足す」にしたいと思ったとする.
これは Lisp では (+ x 2) と表現できる.インタプリタ上ならば

> code
(* x 2)
> (setf (car code) '+)
(+ x 2)

となる.(もし熱烈な C/C++ & XML ファンなら,同様の操作を表現してみよう )
さて,これをコンパイルしてみよう.このとき,コードは引数 x を一個とるわけなので関数で
ラップする.これは (lambda (x) (+ x 2)) と書ける.Common Lisp の compile メソッドを使うと

> (compile nil '(lambda (x) (+ x 2)))
#<compiled-function>

これでコンパイルされたコードが得られる.もしネイティブコードコンパイラ
を使っているならネイティブコードが得られる.確認したければ,すかさず

> (disassmble *)

とうてばよい.このようにコンパイラは Lisp 環境と統合されており,利用者が気軽に使える存在なのである.
(もし熱烈な C/C++ & XML ファンなら,表現した構文木をコンパイルしてからディスアセンブルしてみよう)


739:デフォルトの名無しさん
05/11/02 02:59:33
C で同じことやりたいなら cc -fpic 実行して dlopen するだけじゃない?
KCL 系だってそうやってんだし。

740:デフォルトの名無しさん
05/11/03 13:38:27
コンパイラスレのからの客人?でも KCL とかっていうことはこのスレの人かな?
まぁ,Lisp では手軽さがケタ違いです.C を直接さわったら操作するたびに,
C のソース <--> データ構造 を変換しなきゃいけないのですが,逆に S 式な
ら変換する必要はない.

まぁ,どうしてもと言うなら C っぽく入力列 (S 式風味) をパースしてコンパ
イル,実行という手順でもいい.例として forth 風味の言語を考えよう.

def double
2 *
end
def quad
double double
end
def fib
dup 1 > if
dup 1 - fib swap 2 - fib +
end
end
reset
5 quad fib print

これでフィボナッチ数列の 20 番目を表示したいとする.大袈裟に言うと,
たとえば gcc のバックエンドにこの言語のフロントエンドを作るという事になる.
これは手軽か?(まぁ,手間以外の難易度は Lisp だろうとなんだろうと簡単なんだけど…)

741:デフォルトの名無しさん
05/11/03 13:41:51
まずパッケージと,基本オペレータを準備する.まぁ,とりあえずスタックはリストで
表現し,スタックのクリア,表示,スタックトップの入れ替え,コピーという基本操作を
使う.算術演算子も lisp のやつを流用する.と,オペレータの定義はこうなる.

(defpackage :mini-forth (:use :cl) (:export #:parse #:run #:forth) (:shadow #:print #:pop #:push #:+ #:- #:* #:/ #:> #:< #:= #:>= #:<=))
(in-package :mini-forth)
(defparameter *stack* nil)
(defmacro defword (word args &body body)
(let ((binds (loop for v in args collect (list v '(cl:pop *stack*)))))
`(defun ,word () (let* ,binds ,@body))))
(defmacro default-operators (&rest operators)
`(progn
,@(loop for op in operators
collect `(defword ,op (x y) (cl:push (,(intern (symbol-name op) :common-lisp) y x) *stack*)))))
(defword print () (loop for e in *stack* for i from 0 do (format t "~&~4D: ~A~%" i e)))
(defword reset () (setf *stack* nil))
(defword swap (x y) (cl:push x *stack*) (cl:push y *stack*))
(defword dup (x) (cl:push x *stack*) (cl:push x *stack*))
(default-operators + - * / > < = >= <=)


742:デフォルトの名無しさん
05/11/03 13:43:17
あとは入力をパース(手抜き)する.

(defun parse (program &optional (ast nil) &aux (word (first program)))
(cond ((or (null program) (eq word 'end) (eq word 'else))
(values (nreverse ast) program))
((or (stringp word) (numberp word))
(parse (cdr program) (cons `(cl:push ,word *stack*) ast)))
((eq word 'if)
(multiple-value-bind (tree next)
(parse (cdr program))
(multiple-value-bind (tree2 next2)
(parse (if (eq (car next) 'else) (cdr next) next))
(parse (cdr next2) (cons `(if (cl:pop *stack*) (progn ,@tree) (progn ,@tree2)) ast)))))
((eq word 'def)
(multiple-value-bind (tree next)
(parse (cddr program))
(parse (cdr next) (cons `(defword ,(cadr program) () ,@tree) ast))))
(t (parse (cdr program) (cons `(,word) ast)))))

で,得られた S 式をコンパイル(Lisp コンパイラを流用)して実行.

(defun run (program)
(let ((tree (cons 'progn (parse program))))
(funcall (compile nil `(lambda () ,tree)))))


743:デフォルトの名無しさん
05/11/03 13:51:52
この forth もどきにさっきのプログラムを喰わせる.

MINI-FORTH> (run '( [さっきのプログラム] ))
0: 6765

計算できたッ!! ついでにこの簡易言語で定義された関数 fib とかはLisp コン
パイラでコンパイルされている.つまりネイティブコードコンパイラを使って
いればネイティブコードが得られる.

MINI-FORTH> (disassemble 'fib)
; 09AB6F66: 8BD4 MOV EDX, ESP ; no-arg-parsing entry point
; 6F68: 83EC0C SUB ESP, 12
; 6F6B: 8B05886DAB09 MOV EAX, [#x9AB6D88] ; #<FDEFINITION object for DUP>
; 6F71: 31C9 XOR ECX, ECX
; 6F73: 896AFC MOV [EDX-4], EBP
; 6F76: 8BEA MOV EBP, EDX
; 6F78: FF5005 CALL DWORD PTR [EAX+5]
; 6F7B: 8BE3 MOV ESP, EBX
[...]

…というような説明でどうかな?

744:デフォルトの名無しさん
05/11/04 01:46:00
む、つまりこれはforthのトランスレータ?
結構短く書けるもんだね。


ところで↓のスレとここはどう使い分けてるの?
スレタイ同じだから混乱するぜ。

【一日】CommonLisp【一門】
スレリンク(tech板)


745:デフォルトの名無しさん
05/11/04 02:05:48
スレタイが違うので混乱はしない。

746:デフォルトの名無しさん
05/11/04 04:54:18
>>744 宣伝乙

747:デフォルトの名無しさん
05/11/08 00:07:54
すいませんが、解の公式を使って二次方程式の解を出す関数の定義の仕方を
教えてください。どうも、±がどう表現していいか分からなくて…。
よろしくお願いします。

748:デフォルトの名無しさん
05/11/08 00:09:53
↑宿題?

749:デフォルトの名無しさん
05/11/08 00:13:37
たぶん。

>>747
> ±がどう表現していいか
思考様式の変革が必要だと思う

750:デフォルトの名無しさん
05/11/08 00:27:29
多値で返すとか、リストで返すとか好きなやり方選べばいいんでないの。

751:デフォルトの名無しさん
05/11/08 00:30:53
つうかやる気ねーんだろ?授業をちゃんと聞いてなかったみたいだし。「

いつも思うんだけどなんで〜日までの宿題ですやる気ないんで教えてください、
って素直に言えないのかね?まさか宿題である事を隠してるつもりなのか?なら
人をナメすぎだな。ほらこれを提出してごらん。俺は親切だから罠をしかけたりしないよ。

(defun solve (a b c)
"ax^2 + bx + c = 0"
(let ((A (- b))
(B (sqrt (- (* b b) (* 4 a c))))
(C (* 2 a)))
(values
(/ (+ A B) C)
(/ (- A B) C))))


752:デフォルトの名無しさん
05/11/08 00:39:19
漏れのエスパー能力によると>>747が求めているプログラムは Lispではないな。

753:デフォルトの名無しさん
05/11/08 00:41:43
>>750
±にあたるものが存在してないのが問題の山なのかも。
存在してても使いにくそうだけど。

754:デフォルトの名無しさん
05/11/08 05:01:13
そういえば複素数も扱えるんだよな
でも>>751はaが非零でないことくらいはチェックした方がいいと思う

755:747
05/11/08 22:31:36
どうもどうも。おかげさまで解決しました。
視点を変えました。>>751のプログラムもある意味参考にさせていただきました。

756:デフォルトの名無しさん
05/11/08 22:55:05
>>755
変数名変えた程度で提出してそうだな.


757:デフォルトの名無しさん
05/11/09 10:52:42
数年前からWIREDで学生のレポートのコピーと教授のいたちごっこが記事になっ
たりとかしてるけど、いっこうに解決してないよな、この問題。
数ヶ月か一年おきくらいの間隔で問題にした記事を見てる気もする。
Comm. ACMの先月号でも Academic Dishonesty and the Internet つって
とりあげてるし。なんでもclass project(宿題というよりはレポートに相当か)
を外注に出す奴までいたそうだ。何のために大学に来たのかと小一時間(ry

そういう学生のイカサマは許さんと頑張ってくれる教官は日本の大学にも
いるんだろうか。なんかそんなやつ放っとけ面倒だと知らんぷりになりそうなんだが。


758:デフォルトの名無しさん
05/11/09 10:58:03
今後の(学内or社会人)人生で困るならその程度だし困らないならそれもまたその程度。

759:デフォルトの名無しさん
05/11/09 11:26:00
企業活動もアウトソーシングに頼る時代なんだから別にいいんじゃない?
卒論だって金でやってもらえる時代ですよ。
教官だって普段の学生の様子を見てれば、まじめにやってるやつと
金で解決したやつの違いくらいわかるでしょ。わからなかったり、
わかっても注意しなかったら、その程度の教官ってこと。

でも>>747はこんなとこで聞く前に、教官に質問しろ。
払った授業料以上のものを貰わないともったいないぞ。
質問しても答えてもらえなかったらダメな先生に当たったと諦めろ。

760:デフォルトの名無しさん
05/11/09 11:36:09
教官としてはどうでもいいんだが。精査したり注意してやる義理もない。

761:デフォルトの名無しさん
05/11/09 11:47:02
無駄なレポート書く暇あったら自分の勉強したいよ

762:デフォルトの名無しさん
05/11/09 11:50:21
どうでもいいならレポートや宿題なんて出さないで欲しいよな。

763:デフォルトの名無しさん
05/11/09 12:01:17
>>762
君たちにとって無駄でどうでもいいのなら提出しなければいい。

764:デフォルトの名無しさん
05/11/09 12:03:45
単位を貰うために、最小限の労力とリスクで、レポートを仕上げる

765:デフォルトの名無しさん
05/11/09 12:30:01
単位をもらうためならそれでいいよな。
単位に値しないなら労力を割かないほうがよい。
単位取得を重要視するなら学生側でそれくらいのマネジメントくらいしろ。

766:デフォルトの名無しさん
05/11/09 12:33:44
やっぱ宿題には黙って答えだけだな。
余計な事言うから >>757-765 のような板違い連中を釣り上げちゃう。

767:デフォルトの名無しさん
05/11/09 20:47:57
自分の望むレスだけしか見たくないんですか?
答えだけ欲しければ宿題スレへいけ。

768:デフォルトの名無しさん
05/11/09 21:07:39
じゃあ教授と学生のいたちごっこを見事な再帰で表現>>768

769:デフォルトの名無しさん
05/11/09 21:51:43
うちの研究室、プログラムの類似度判定やってた。
教授が集めてきた学生たちのレポートを実験の対象にしてた。
結果、年度・言語に関わらず、2〜3の大きいグループができると判明した。


770:デフォルトの名無しさん
05/11/13 01:34:50
以下のようなことを実行するにはどうすればいいのでしょうか?

(setf a '(+ 1 2))
(setf b '(+ 3 4))
(setf c '(- b a))

(myfunc c)
4

あるリストファイルを読んで内部にツリー構造をつくり、
それを一気に実行することを望んでいます。
具体的には、内部で以下のように展開してから実行したいと
思っています。

(eval '(+ (+ 1 2) (+ 3 4)))

何かヒントだけでも頂けたら嬉しいです。どうぞよろしくお願い致します。
m(_ _)m

771:デフォルトの名無しさん
05/11/13 01:58:53
>>770
こんなんでどうだ。
(defun expand (x)
 (cond ((symbolp x) (expand (symbol-value x)))
     ((numberp x) x)
     ((listp x) (cons (car x) (mapcar #'expand (cdr x))))
     (t (error "unknown type: " x))))

(defun myfunc (x) (eval (expand x)))

772:デフォルトの名無しさん
05/11/13 02:45:02
変った宿題だな。とりあえず読み込みたいリストファイルの例を示して。
それによって難易度が違うんで。

(+ 1 2)

なのか

(setf a '(+ 1 2))

なのか。使う関数は +, *, -, / なのか Lisp のフル機能の使うのか,など。


773:770
05/11/13 12:58:24
>>771
ご回答ありがとうございます。m(_ _)m
採用させていただきます。
初心者のくせに変にマクロに拘ってハマってました・・・

>>772
自主制作ソフトに必要な機能なんです。(趣味です)
リストですが・・・

vA_out 1
vB_out 2
vC_out 3
vD_out 4
fPlus1_in vA_out
fPlus1_in vB_out
fPlus1_out fMinus1_in1
fPlus2_in vC_out
fPlus2_in vD_out
fPlus2_out fMinus1_in2
fMinus1_in1 fPlus1_out
fMinus1_in2 fPlus2_out
fMinus1_out retrun

を予定してます。ちょっと冗長ですが・・・。
関数は将来的に増える予定です。Lispのフル機能を使っていきたいと思います。


774:770つづき
05/11/13 13:03:05
>>773のリストを読み込んで、内部で>>770のようなツリーを組み立て
最後に実行して答えを返す予定です。

>>772
問題にご興味を持っていただきありがとうございました。
もし宜しければ、ヒントなど頂けたらと思います。

775:デフォルトの名無しさん
05/11/13 13:54:45
なるほど S 式じゃないプログラムリストって意味だったのか。
このプログラムの動作はどんな動きをするんかな?
今はこのファイルを Lisp のリスト形式 (S式) に手動で変換してるんだよね?

たとえばプログラム言語としての機能を持たせたいなら(条件分岐とか)
>>740 からのレスが参考になるかもしれないし、このリストをもう少し S 式風
にカスタマイズできるなら read 系の関数を使って字句解析を省略できる。


776:770
05/11/14 20:37:38
>>775
実はあるプログラム言語をパクろうと思ってます。(^^;
もちろん、自分なりの発展はさせるつもりですが。

>今はこのファイルを Lisp のリスト形式 (S式) に手動で変換してるんだよね?

そうです。

>たとえばプログラム言語としての機能を持たせたいなら(条件分岐とか)
>>>740 からのレスが参考になるかもしれないし、このリストをもう少し S 式風

早速参照してみます。

>にカスタマイズできるなら read 系の関数を使って字句解析を省略できる。

あまり複雑なS式はむりですが、出力の形式を弄る程度でできるS式には
しようと思ってます。
(setf vA 1) ←この程度ですが・・・(^^;


また、質問させていただくかもしれません。今回はアドバイスありがとうございました。

777:デフォルトの名無しさん
05/11/15 17:38:38
770 とは別人なのですがついでに聞かせて下さい。
Lisp コードの中にいわゆる普通の infix の数式を入れて書きたいと思ったら
どういう手が考えられるでしょうか。
つまりこんな感じで出来ればいいんですけど
(defun f (x y) ( + 1 y %%% x^2+y^3 %%% ))
プリプロセッサを通すとかじゃなくてやろうと思ったらどうしますか。

778:デフォルトの名無しさん
05/11/15 17:57:12
URLリンク(groups.google.com)
URLリンク(groups.google.com)


779:777
05/11/15 18:22:40
本当にありがとう。やっぱ reader macro で出来るんですね。使います。

780:デフォルトの名無しさん
05/11/15 23:08:40
使うのかよ!

781:デフォルトの名無しさん
05/11/16 12:42:27
reader macroのわかりやすい解説ってないでしょうか?



782:デフォルトの名無しさん
05/11/16 13:11:18
>>781
なんだかんだ言って CLtL2 が一番わかりやすかった。w

783:デフォルトの名無しさん
05/12/06 16:53:20
規格書は紙で持っとくと、初心者レベルの時でも結構役に立つよ。
ansiの店で$18で売ってます。

784:デフォルトの名無しさん
05/12/07 10:30:59
本スレのCLOSの話題について行けないバカな漏れに
MOPのなんたるかから教えて下さい。

785:デフォルトの名無しさん
05/12/07 13:04:06
>>784
AMOP読め。または図書館へ行って昔のbit別冊を探せ。

786:デフォルトの名無しさん
05/12/07 19:49:24
AMOPって今でも、新刊買えますか?
TinyCLOSは、いじってて面白かったなぁ。またいじりたいなぁ。
Kiczalesは、Aspect orientedなる概念を提唱して、ずぅーっと
遥か彼方まで行ってしまったね。
Kiczalesのアイディアを具体化しようとしている連中は、なぜか
Java、Rubyにご執心みたいだけど。

787:デフォルトの名無しさん
05/12/07 20:12:37
>>786
買えるよ。日本アマゾンは3〜5週間だが、USアマゾンなら24時間以内発送。
URLリンク(www.amazon.co.jp)
URLリンク(www.amazon.com)

788:デフォルトの名無しさん
05/12/07 20:15:14
On Lisp邦訳の次はAMOP邦訳に挑戦して頂きたい。>野田さん

789:デフォルトの名無しさん
05/12/07 22:00:57
翻訳終わる頃には、ネタとして終わってる悪寒。
最先端とはいわないまでも、半分より前、できるなら先頭グループ
を走りたいなら、原著は避けられないと思うよ。
まぁ、かくいう俺も日本語と英語しかわからないのだけどな。

790:デフォルトの名無しさん
05/12/07 22:42:59
先頭グループもなにも、MOPやCLOSはかなり前からあるんじゃないの?

791:デフォルトの名無しさん
05/12/08 02:30:22
>>786
そうか? AMOP からさほど進化したとは思えないんだが…


792:デフォルトの名無しさん
05/12/14 23:14:08
clisp上でMAXIMA使いたいんですが解説サイトとかありませんか?
最新版に対応しているところが見つからないんですが

793:デフォルトの名無しさん
05/12/20 01:46:09
climacs に期待...

794:デフォルトの名無しさん
05/12/20 19:14:13
Schemacsとか作る奴はおらんのか?

795:デフォルトの名無しさん
05/12/20 23:38:21
climacs は SBCL ありきだからなぁ。Scheme で Native Thread が使えて
ネイティブコンパイラな実装があれば話は別だが。

796:デフォルトの名無しさん
05/12/21 00:26:33
climacsも概ね動くようになったところで飽きて放置に100りちゃーど

797:デフォルトの名無しさん
05/12/21 07:51:11
>>794
ngscmというものならある。

798:デフォルトの名無しさん
05/12/23 05:33:14
シンボルを全部日本語にして日本語Lispとして売り出す(笑)

799:デフォルトの名無しさん
05/12/23 07:25:40
>>798
日本語Lispなら、S式はリストの先頭でなく末尾を関数とみなすようにしないと。

800:デフォルトの名無しさん
05/12/23 09:57:03
(甲 3 とする)
(乙 5 とする)

(甲 乙 対にする) => (3 . 5)

((甲 2 加える) 乙 乗ずる) => 25

助詞が欲しいな。


801:デフォルトの名無しさん
05/12/23 10:13:37
もともとのLispも英文にはなってないんだから、
日本語Lispといっても別に、その辺まですり合わせなくていいんじゃないかな。

802:デフォルトの名無しさん
05/12/23 13:05:23
>>799-800
括弧を取ればそのままFORTHになるという利点(?)があるな。

803:デフォルトの名無しさん
05/12/23 13:54:53
それだったら最初から Forth の方が。
つまり GikoForth なわけですが。

804:デフォルトの名無しさん
05/12/23 19:59:15
(おぼえる かいじょう (い)
  「0から い までかけあわせる」
  (もしも (ぜろか い)
    1
    (かける い (かいじょう (いちひく い)))))

805:デフォルトの名無しさん
05/12/23 20:28:09
(いれる ●にわとり 「こけこっこー」)
(いれる ●ねこ 「にゃぁにゃぁ」)
(いれる ●ぶた 「ぶーぶー」)

(みる ●にわとり)
→ こけこっこー

806:デフォルトの名無しさん
05/12/24 01:10:35
SBCL の Win32 ポートがいよいよマージされるみたいだな。

URLリンク(sourceforge.net)

;; Macho のアーカイブ止まっちゃったのか。

807:デフォルトの名無しさん
05/12/26 22:08:00
>>805
carとかcdrとかcdadarとかはどうやって表現するんだ。

808:デフォルトの名無しさん
05/12/27 01:04:54
car ⇒ 住所登録所の内容
cdr ⇒ 値登録所の内容
cdadar ⇒ 住所の値の住所の値登録所の内容

809:デフォルトの名無しさん
05/12/27 01:47:02
car => これ
cdr => それ
cdadar => そこそこれ

810:デフォルトの名無しさん
05/12/27 01:55:43
car/cdr は箱(コンスセル)から要素を取り出す操作だから、

car: とりだす
cdr: つぎをとりだす
cdadar: つぎのまえのつぎのまえをとりだす

関数は動詞且つ和語で統一したい所だけど、苦しいかな...

811:デフォルトの名無しさん
05/12/27 02:26:21
>>809
それイイネ

812:デフォルトの名無しさん
05/12/27 10:26:20
>>809
anaphoric ifのitはどうすんだ


813:デフォルトの名無しさん
05/12/27 11:57:15
>>812
「あれ」

814:デフォルトの名無しさん
05/12/30 19:42:32
URLリンク(clozure.com)

x86 の文字がちらほら見えるけど、OpenMCL も x86 に移植されるみたいだね。
素晴らしい。

815:デフォルトの名無しさん
06/01/09 22:24:16
lispで作った関数なんかは、何処に保存されてるのでしょうか?
lispのコードをいじる課題が出たのですが、
コードの保存を自分でやらなきゃならなくなって困ってます。

816:デフォルトの名無しさん
06/01/09 22:52:09
教官に聞け

817:デフォルトの名無しさん
06/01/09 22:59:50
それを見つけるのが課題。。

818:デフォルトの名無しさん
06/01/10 10:08:05
「エディタで新規にファイル作ってその中に書け」が答のような気もする

っていうかLisp関係ないな
対話的にしかLispを使わない授業だったと推測するが

819:デフォルトの名無しさん
06/01/10 14:24:33
>>815
それ、Smalltalk使いの私も訊きたいです。

Smalltalkでは、関数(メソッド)が自身のソースを属性として持っていて比較的
容易にたぐれるんですが、Lispでは環境内でのソース管理はどうなっているんでしょうか?

818の行間を読むと、対話的に作られた場合、関数は自身にかかわるソース情報を
(デコンパイルなどで特殊な方法で別途得る以外)他の一般的な言語と同様、
いっさい失ってしまうのが当り前…というような印象を受けるのですが。

820:デフォルトの名無しさん
06/01/10 22:47:35
>>819
ANSI CL の範囲では無いと思う。ANSI Smalltalk もソースコードの管理までは
規定してないでしょ?

821:デフォルトの名無しさん
06/01/10 23:15:09
function-lambda-expression()
lambda 式が取れなくても規格合致だけど

822:デフォルトの名無しさん
06/01/11 06:36:04
>>819
「関数」はソース+定義環境だから、ソースだけ取れてもそれを保存
するみたいなことには向かないだろうね。デバッグの助けにするだけなら
いいだろうけれど。

(let ((n 0))
(defun incr (k)
(incf n k)))

なんてした時に、incrのソースはどこからどこまで? ってことね。


823:デフォルトの名無しさん
06/01/11 16:34:30
なるほど。Smalltalkのブロック(クロージャ)のソースは、メソッド(関数)のそれと
違って容易にはたぐれない…のと状況は似ていそうですね。ありがとうございます。

824:デフォルトの名無しさん
06/01/11 17:02:36
URLリンク(www.shiro.dreamhost.com)
これ読んでLisp使いたくなりました。
入門サイト教えろこの野郎m(__)m

825:デフォルトの名無しさん
06/01/11 18:29:40
>>824
ぐぐれこの野郎(^^)

826:デフォルトの名無しさん
06/01/11 18:41:45
>>824
URLリンク(www.geocities.jp)
xyzzy向けの内容が入ってるけど

827:デフォルトの名無しさん
06/01/11 20:37:58
>>824
URLリンク(www.h7.dion.ne.jp)

日本語のサイトではここが一番良かった。

828:デフォルトの名無しさん
06/01/13 19:50:45
すまんがLispで生産性があがるってのはどのへんのせいなのでしょうか?
>>824 の本を読んで興味持ったんだけれどよくわからんです。
コンパイル->実行とかの過程も処理対象にできるっていうのはやりようで面白いことできそうかと思ったんですが。
いまはC#つかいなのですが、.NETでのReflection,CodeDOMあたりの機能でしょうか。


829:デフォルトの名無しさん
06/01/13 20:10:48
いろんな要素が絡んでるから難しいけど。
最近機能が増えた言語や開発環境(なんでもいい)で、これが入って
生産性が上がったなーってもんをリストアップしてみ。
そのリストはLispの生産性の高さの理由のリストとかなり重なると思うよ。



830:デフォルトの名無しさん
06/01/14 01:43:00
使用者への効果でいうと「マルチパラダイム」が一番大きいと思う.型がない.
手続き型でも関数型でも論理型でも並列型でもオブジェクト指向型でも,それ
に合わせられる.クラスによる分類が向かない分野では,迷う事なくそれ以外
の手法をとれるしね.

マクロによるプログラム変形とかはそういった言語カスタマイズのための道具
で,本当はこの「どんなパラダイムでもどんとこい」というのが最大のメリッ
トだと思う.個人的にはね.

831:デフォルトの名無しさん
06/01/14 04:40:52
あのー
おばかで申し訳ないですが、

自分、VC++でコンソールアプリ作っております。
一部のc++の関数をLispで置き換えたいと思っておるのですが、

これって可能なんでしょうか?

おしえてえらいしと



832:デフォルトの名無しさん
06/01/14 13:24:37
>>831
だいたいできると思うけど、GC関係でいろいろややこしいところは覚悟しないといけない。

833:デフォルトの名無しさん
06/01/14 14:01:57
可能だけど,ある程度 C++ と Lisp の知識がいるよ.

1) DLL を出力できる Lisp コンパイラをもっている (普通の DLL と同じ)
2) ecl を組み込む
3) プロセス間通信する

3. がいちばん簡単かなー

834:デフォルトの名無しさん
06/01/14 17:27:18
>>829
C++からC#にかわったんだけど
・Generics(これはC#1.0になかったものとして) テンプレートでないのがちょっと不満。
・リフレクション
・デリゲート 呼び出しをオブジェクト化することでいろいろ使える。
・イベント デリゲートの呼び出し管理の簡略化
・リモーティング プロセス間呼び出しを楽にした感じ
・インテリセンス(これは開発環境) これあってすごい楽になった。ヘルプとか引く回数激減。
条件に基づいてコード生成、それの管理とかできるともっといろいろ面白いことできるのかなぁとおもうけど。

835:831
06/01/14 17:46:11
>>831
>>832

情報dクス

・・・ここ数日間、GCL,CLisp ( Chicken, Gambit-C )
が吐き出すCコードをVCでコンパイルして.Libを作成しようとしてますた

直接 DLLを出力できるLispコンパイラ使わないと駄目何すね


・・・DLLを出力できるLispコンパイラ、知っていたら教えてくらはい
(上で騒がれてた、ACLってやつなのかな?)

教えて訓でスマソ




836:831
06/01/14 17:48:34

↑ 自分に礼いってた orz

>>832
>>833
ですた

837:デフォルトの名無しさん
06/01/14 17:55:44
>>834
敢えて挑発的に書けば...

Generics: 動的型なら元から不要
リフレクション: 元からある
デリゲート: クロージャの劣化再発明
イベント: クロージャが無いから無理してる
リモーティング: S式送ってevalさせればいいだけじゃん
インテリセンス: 80年代からあると思うけど

もちろん、静的型言語が持つ型安全性の保証とかはLispは弱い。
自分でがりがり書けば出来なくはないけれど。

条件に基づいてコード生成って?


838:デフォルトの名無しさん
06/01/14 18:10:18
LispWorks はできるよ.ACL もできるんじゃねーかな.
ECL もできる.GCL もできそうだけど… GCL 知らないスマン

# しかし CLISP は C コード吐かないだろう.

839:831
06/01/14 18:43:48
>>838

どうもっす
ECLでゆきます

・・CLisp、間違えます田
色んなのためしてたらわからなくなてた


ありがとうございました

840:デフォルトの名無しさん
06/01/14 19:04:59
>>837
C++から入ってC#やってるのでその辺の概念がまったくわからんです。
なんか最近頭がうにになってるし。
オブジェクト指向に頭が固まってる希ガス。

Lispというか関数型の利点がいまいちわかってないのでC++とかだとこんな風にしかできないけどそこをこんなエレガントにできるよって感じで教えてもらえないですか?

条件に基づいてコード生成ってのは、画面の生成とかをXAMLみたいなスクリプトに落として扱ってるんだけれどそれをそのままプログラムコードで生成したりしとか操作に基づいてロジックを生成してそのままプログラム中で扱えたりするといろいろできるかという話。


841:デフォルトの名無しさん
06/01/14 20:25:20
>>840
>操作に基づいてロジックを生成

これって具体的にはどういうイメージで言ってるの?

842:デフォルトの名無しさん
06/01/14 23:07:07

gclでウィンドウを生成してその中で二点を定めて
線を引くというような簡素なプログラムを組みたい
のですがどうすればよいでしょうか?どなたかご存知な
方お願いします。
まずウィンドウを生成するやり方からわかりません。。

843:デフォルトの名無しさん
06/01/14 23:29:43
GCL 使った事無いけど、これじゃないの?
Tcl/Tk は別途インスコする必要あるかもしれないけど。

URLリンク(www.sunsite.ualberta.ca)

844:デフォルトの名無しさん
06/01/15 00:02:22
>>841 行った操作を覚えたりとか、拡張言語として使うとかですかね。


845:デフォルトの名無しさん
06/01/15 00:41:22
>>843
ありがとうございます。
結構使えそうです。


846:デフォルトの名無しさん
06/01/15 02:04:13
>>837
> インテリセンス: 80年代からあると思うけど
あればなんでもいいってわけじゃないだろw
開発環境が(良くも悪くも)重厚長大ですげえんだよMSのは。


847:デフォルトの名無しさん
06/01/15 02:22:14
>>846
世界の狭い奴だな

848:デフォルトの名無しさん
06/01/15 04:14:14
lispのコンソールから打ち込んだ文字(プログラムを走らせる前)
をすべて保存するようにしたいのですが、
打ち込んだ文字列は、なんていう変数やらストリームに保存されてるんですか?

849:デフォルトの名無しさん
06/01/15 04:21:20
URLリンク(www.franz.com)


850:デフォルトの名無しさん
06/01/15 04:33:06
ありがとうございます。
でも、コマンドラインの変数名も知りたいのです。
わからないでしょうか?


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5387日前に更新/244 KB
担当:undef