電子書籍の厳選無料作品が豊富!

学習用に簡単に使えるLispの処理系 ISLisp を導入しました。ところがsetq関数がエラーとなり、最初からつまづいてしまいました。対処法がわかれば教えてください。

「ISLispのsetq関数について教えて」の質問画像

質問者からの補足コメント

  • うれしい

    cametan_42さん、ありがとうございます。変数を大域変数にしておけばいいのですね。下記のようにやったらうまくいきました。

    >(defglobal x 10)
    x
    >x
    10
    >(setq x 20)
    20
    >x
    20

    ISLispは規格の名前でしたか。こちらのサイトで見つけました。

    http://www.islisp.org/index-jp.html

    OK! ISLisp というのが処理系の名前でした。.exeファイル1つだけで動くので、簡単でよいと思いました。Common Lispはシステムが大きく、初心者には荷が重いです。

    昔々16ビットPC用のmu-Lispという処理系でちょっとだけ遊んだことがあるので、またやってみたくなりました。そのときはいきなりsetqを使っても問題なかったような記憶があります。

      補足日時:2021/08/04 21:19

A 回答 (3件)

> 変数を大域変数にしておけばいいのですね。

下記のようにやったらうまくいきました。

あと、大域変数だけじゃなくって、letで定義した局所変数対象でもうまくいくんじゃないでしょうか。

> (let ((x 10))
   (setq x 20)
   x)
> 20

> OK! ISLisp というのが処理系の名前でした。

ああ、沖電気工業が作った処理系かな?
多分ISLISPの仕様が決まってからすぐさま作ってくれた元々は商用の処理系だったと思いますけど。

> Common Lispはシステムが大きく、初心者には荷が重いです。

そうですね。かなりデカいのは事実です。
ぶっちゃけ、Lisp初心者にはCL系よりもSchemeかSchemeの亜種の方が向いてますよね。
世界的に一番売れてる、っつーか使われてるLisp処理系は、今だと多分Racketだと思います。

Racket:
https://racket-lang.org/

オールインワンのタイプで、昔のBASICよろしく、インストール、即起動、IDE付きってんで、簡易性から言うとこれに勝てるLispはありません。多分これが世界的に一番人気です。
また、自分が書いたソースコードをコンパイルしてスタンドアロンのexeを作れる辺りでもオススメです(ただ、日本語が絡むとコンパイルが失敗する、ってぇのが玉に瑕)。

> 昔々16ビットPC用のmu-Lispという処理系でちょっとだけ遊んだことがあるので、またやってみたくなりました。

テキサス・インスツルメンツ制のCommon Lispのサブセットかしら?
昔のTIってLispマシンも作ってたし、割にLispには本腰いれてたんですよね(笑)。

> そのときはいきなりsetqを使っても問題なかったような記憶があります。

はいそうです。
ってか、今のCommon LispやSchemeでもそうなんですよ。
Common Lisp Hyper Specだと

CLHS(setq):
http://www.lispworks.com/documentation/HyperSpec …

何も書いてないんですが、一方、defparameterやdefvarで一旦変数をキチンと定義しないでsetqをいきなり使えば警告を出す処理系も多いですね。
Racketの場合は、ISLISPと同様に、一旦defineで変数を定義しないでいきなりset!を使うとエラーを出します。

写真: Racketの例。defineで変数定義をせずset!(Common Lispで言うsetq)をいきなり使おうとするとエラーを食らう。
「ISLispのsetq関数について教えて」の回答画像3
    • good
    • 0
この回答へのお礼

cametan_42さん、ありがとうございます。おー、Racket。いかにも軽くていいネーミングです。こちらも使ってみたいと思います。それにしても、Lispファミリーは半端ない数ですね。

mu-Lispは現在でもあるようで、ご推察のようにTI社が関係しているようです。どうもお金がかかるみたいです。
http://www.edm2.com/index.php/MuLISP#Author_.26_ …

完璧な回答のため、ベストアンサーといたします。ありがとうございました。

お礼日時:2021/08/04 23:23

あ、ちなみに、



> 学習用に簡単に使えるLispの処理系 ISLisp

ではないです。
ISLISPは処理系の名前じゃありません。
ISLISPはISO(国際標準化機構)で唯一公式に制定されてるLisp方言の「規格」であって、処理系の名前じゃないんですよ。
むしろ、生憎、処理系の数がどっちかっつーと「無い」とか「少ない」と言うレベルの、ぶっちゃけ「存在自体が殆ど忘れ去られた」Lispの規格、って言って過言じゃないです。
JIS(日本産業規格)にも制定されてる唯一のLisp系規格なんですけどね。
どこで入手されたか知らないですが、学習用じゃなくって、むしろ珍しいですね(笑)。どーやって入手したんだろ(笑)。
    • good
    • 0

ええとですね。


setqでいきなり変数を定義出来るのはCommon Lispなんですよね(非推奨だけど)。
ISLISPの場合、大域変数的にdefglobalとかdefdynamicとしてxを定義しておくか、あるいはletで局所変数としてxを定義しておいて、「束縛を変更する」時にしかsetqって使えないんじゃないかしらん。
Unbound Variable: X
と言うメッセージはそれを表しています。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!