#(defun extract-word (text)
(delete-duplicates
(cl-ppcre:all-matches-as-strings "[a-za-z] {3,}" text)
:test #'string=)) この関数を使ったら AS-STRINGS called with arguments ("[a-zA-Z] {3,}"
"foo bar baz") . というのがでて実行できません。なぜでなんですか?
#その正規表現がマッチするのはアルファベットと空白三つ以上じゃないすかね…
#あとloadでファイルを読み込もうとするとUnbound variable: TOPLEVELとかUnbound variable: CL-USER>
[Condition of type UNBOUND-VARIABLE]
と出るんですが何が原因なんですか?
#変数が束縛されていない状態ですが、もすこし状況を詳しく
#「CL-USER> (lisp-code)」みたいのをそのままコピペしてるに一票。
#何も書かれていないファイルは読み込むことができるんですが、コードが書いたものだと例のエラーが出てしまいます。何も書かれていないファイルにコードを上書きしてもエラーが出ます。
#そのloadしようとしているというコードをここで開示することは可能ですか?
#(defun hello-world ()
(format t "hello world"))
HELLO-WORLD 簡単なコードなんですが読み込めません
#処理系とREPLに入力している内容と結果、教えていただけます?
#CL-USER(1): (load "hello.lisp")
; Loading /Users/maru/hello.lisp
T
CL-USER(2): (hello-world)
hello world
NIL
CL-USER(3):
#コード自体の問題ではないと思います。
#処理系はemacsで開発環境はslimeです。 もしかしたら保存の方法などが間違っているかもしれないです。 write curento buffer to another file(c-x c-w) で保存しているんですが...
#SLIMEの後ろにいるのは誰?
#ごめんなさい 後ろとは?
#あれ、ひょっとしてEmacs LispもSLIMEで開発できたりすんの? いま
#わかりませんが lisp in a box という実践common lisp のサイトから手に入れたんですが
#Emacsで動いているSLIMEを経由してCommon Lisp処理系とお話してると思うのですが、Common Lisp処理系は何が動いています?
#Lips in a Boxかぁ… 使ったこと無いな。ちとそのサイト見てくる
#Lispboxなら今はClozure CLだったと思います。
#多分それだと思います。
#ファイルをどこか適当な所にアップロードできませんか?
#すみません 若輩者なのでどうやっていいかわからないです。
#最初はみんな初心者ですから安心してください。そしたら、ファイルの中身をここのチャットのテキストボックスにコピー&ペーストしてみてください。
#操作のしかたは分かりますか?
#コードをコピーしてtextに貼ればいいんですか?
#はい。
#(defun hello-world ()
(format t "hello world"))
HELLO-WORLD コードに問題はないようなんですが
#HELLO-WORLDの部分までファイルに保存していますか?
#はい。 駄目なんでしょうか?
#ええ。括弧で囲まれた部分がCommon Lispのプログラムコードです。
#そこはプログラムではないです。
#(defun hello-world ()
(format t "hello world"))
#これだけならだいじょぶなはず。
#let's try
#助っ人がいっぱいきたので退散ー。geeさんファイトです。
#一応loadできました。実は長いコードを書いていてこの問題に出会ってしまったのですが、そのような場合はどうしたらいいのでしょう。いちいちcl-userなどプログラム以外の部分を消さなければならないのですか?
#本とかに書いてあるサンプルコードだと
#CL-USER> (defun hello-world ())
#みたいなのは REPL に打ち込む用なので(SLIME に "CL-USER> " ってプロンプトがあるはず)ファイルに書く場合は (defun ...) の部分だけでおっけーですね。
#REPLとコードを編集しているバッファの使い分けができてない感じと予想。「実は長いコードを書いていて」というのはどこに書いていますか?
#clozure clだと思います。
#いやそうでなくて、Emacs上で
#Emacsでバッファに名前が付いているのは知ってるかな。大抵ファイル名そのものだったりするんだけど。
#*slime-repl ccl* っていうバッファに全部コード入力してたりしない?
#*slime-repl clouzuer cl*でした
#てことは、Emacsはウィンドウ一個だけで使ってる?
#おそらくそうだと思います。
#OK.
#状況把握した
#そんじゃまずウィンドウを分割しよう。EmacsにC-x 2って入力してみて
#C-xはコントロールキー押しながらxね
#2つ出ました
#いま両方とも*slime-repl*?
#はい。
#そしたらC-x C-fって入力すると下の方のミニバッファにファイル名入力しろ、ってメッセージが出るからさっきのhello worldを保存してあるファイルでも何でもいいので適当に名前入れてみて
#コード出現しました。
#片方はREPLでもう片方がコード、の状態になった?
#はい。
#OK. この状態でSLIME使った開発は進めて行くのですよ。コードバッファの方に試しに
#(define howdy-world ()
(format t "howdy, world!"))
#とか書いてみてみて。保存はしてもしなくてもいいです。
#書きました。
#sheme混ざってますよー
#書けたら、いま書いたS式の一番おしりにカーソルを持って行ってC-x C-eって入力してみて
#oops, define -> defunn
#ごめん。defineじゃなくてdefunだ
#了解しました。
#何も起きません。
#ミニバッファに => HOWDY-WORLD って出てない?
#ミニバッファかどうかわからないんですが出ました。
#その操作で「SLIME経由でCCLにHOWDY-WORLDの定義を渡す」のね。で、ホントにCCLに新しい定義が追加されたかどうかを確認するために
#C-x oを入力して*slime-repl*に移動してみてくれる?
#そこで(howdy-world)を入力するとどうだろう
#プログラム動きました。
#雰囲気わかったかな。さっきの毎回CL-USER>消さなきゃいけないんですか?っていう質問に対する答えは、常にREPLの上で作業しているわけじゃないからそもそもそういう作業は必要にならない。
#コードバッファを編集しながら後ろに居るCommon Lisp処理系にどんどん定義を追加して行って、REPLに行ってちょいちょい評価して結果を確認しながら開発していく感じ。
#S式一個ずつの単位じゃなくてバッファ全体をCommon Lisp処理系に評価させたり、バッファ上のある指定した範囲の内容を評価させたりとかいろんな粒度で操作できるのでその辺はSLIMEのマニュアル読んでちょっとずつ慣れて行けばよいと思います
#わかりました。 何とか理解できました。本からはこの雰囲気を感じられなかったのですがmaruさんのおかげ少しlispの処理系などの使い方がわかってきました。ありがとうございます。
#お役に立てたらなによりです。
#もしよろしければ今いろいろ質問させてもらってもいいですか?このチャットで先輩方から学びたいので。
#読んでいる本に見覚えがある感じなのですが是非2章を復習してあげてください…
#わかりました。
#ここに適当に質問書いておけば通りすがりの親切な人が答えてくれると思いますよ :^)
#皆さんはlispを使い初めてどれくらいになるんですか?
#え… と...
#大学の生協で「これがLispだ!」とかいうふざけたタイトルの本を掴んだのが最初だからかれこれ20年近くになるのか… 年食ったなぁ orz…
#20年前と今のlispの存在感は同じなんですか?
#僕はその半分くらい。歳食ったか…
#存在感?
#少しマイナーだけど力を持っている
#そういう印象を受ける人はいつでもそう思うんじゃないかな…と思います。
#なるほど。 lispでオブジェクト指向というかclosって重要なんでしょうか。僕は知識も経験も浅いんですか、オブジェクト指向というものがあまりいいモノに思えなくて。
#個人的な好き嫌いは言えますし利用するしないの選択がlispの中では許されますが、重要か否かはあまり他人が判断するものでもないと思います。
#個人的なスタンスとしてはCommon Lisp内でclosを使わないのは難しくはないけれど、使うべきシチュエーションで使わないで同等機能を実装するのは馬鹿だと思っています。
#そこらへんは人それぞれでしょうけど。