質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
LISP

LISPはプログラミング言語の一種であり、関数型言語に分類されています。 特徴として、括弧を多様する独特の構文を持ちます。

Q&A

解決済

2回答

1396閲覧

clisp reverse append関数の定義

Amateur0845

総合スコア6

LISP

LISPはプログラミング言語の一種であり、関数型言語に分類されています。 特徴として、括弧を多様する独特の構文を持ちます。

0グッド

0クリップ

投稿2021/05/06 17:04

編集2021/05/07 00:00

前提・実現したいこと

大学の授業でCLISPについて学んでいます。
現在
append関数
reverse関数
の自作を行おうと思ったのですが
構成が分かりません。
reverse関数に関しては
1,局所変数で保存配列revを定義
2,loopでrevリストにconsで追加
3,key配列がnullになったらrevをリターンする
と考えているのですがあっているのかすらわかりません。
append関数は再帰で定義するといいと調べたら書いてあったのですが
コードを見ても理解が出来ませんでした。

発生している問題・エラーメッセージ

*** - SYSTEM::%EXPAND-FORM: (NULL 'KEY) should be a lambda expression The following restarts are available: ABORT :R1 Abort main loop

該当のソースコード

clisp

1(defun myreverse (key) 2 (let '(rev)) 3 (loop (cons rev(car (key))) 4 (cons((null 'key)return rev)))) 5

試したこと

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

なるほど、appendreverse二つということでしたか。

reverseについては、上述のようにappend-reverseから作成可能です。

cl

1(defun *reverse (xs) 2 (append-reverse xs '())) 3 4(*reverse '(0 1 2 3)) 5→ (3 2 1 0)

appendは、reverse-appendを少し改造すれば実現できます。

append-reverseでは

(append-reverse '(0 1 2 3) '(a b c d)) ≡ (append-reverse '(1 2 3) (cons 0 '(a b c d))) ≡ (append-reverse '(2 3) (cons 1 (cons 0 '(a b c d)))) ≡ (append-reverse '(3) (cons 2 (cons 1 (cons 0 '(a b c d))))) ≡ (append-reverse '() (cons 3 (cons 2 (cons 1 (cons 0 '(a b c d)))))) → (3 2 1 0 a b c d)

consで後ろの引数リストに追加していくところを、次の実行の先頭にconsで追加していくように変更するだけです。

(*append '(0 1 2 3) '(a b c d)) ≡ (cons 0 (*append '(1 2 3) '(a b c d))) ≡ (cons 0 (cons 1 (*append '(2 3) '(a b c d)))) ≡ (cons 0 (cons 1 (cons 2 (*append '(3) '(a b c d))))) ≡ (cons 0 (cons 1 (cons 2 (cons 3 (*append '() '(a b c d)))))) → (0 1 2 3 a b c d)

cl

1(defun *append (xs ys) 2 (if (null xs) 3 ys 4 (cons (car xs) (*append (cdr xs) ys)))) 5 6(*append '(0 1 2 3) '(a b c d)) 7→ (0 1 2 3 a b c d)

また、全体的なところですが、Lispの文法を理解されていないように思います。
学校の教材の一番最初のステップから飛さずに今回の問題の箇所までもう一度おさらいするのが一番の近道だと思います。
英作文でいうと、pen a this isみたいなことになっていますので、このままでは、先は行き止まりだと思います。

投稿2021/05/07 15:16

g000001

総合スコア65

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Amateur0845

2021/05/08 15:31

返信が遅くなり申し訳ありません。 再度ありがとうございます。 もともとC++でプログラミングを学んでいたのですが今回神の言語をとはどんなものなのかを簡単に 学ぶ講座でした。 手続き型言語と異なりインタープリタ方式の実行方式に慣れず苦労しています。 しかし今回分かり易く教えていただく機会を得れたことでさらに学んでみたいと思うようになりました。 引き続きいろいろな関数などを学んでみようと思います。 ありがとうございました。
guest

0

append reverseという名前だけではどのような動作かは分からないのですが、大抵は、
(append-reverse '(a b c d) '(0 1 2 3))
→ (d c b a 0 1 2 3)
のように頭部のリストがreverseされたものが尾部と結合するというものが多いかと思います。
定義は再帰であれば、

cl

1(defun append-reverse (xs ys) 2 (if (null xs) 3 ys 4 (append-reverse (cdr xs) (cons (car xs) ys))))

のように単純です。

cl

1(append-reverse '(a b c d) '(0 1 2 3)) 2→ (d c b a 0 1 2 3)

動作は、上記のコードでいうとxsが先頭から一つづつ減っていき、その分がysの先頭に追加されていきます。
xsが空になるまで繰り返し、xsが空になったらysを返します。

0 append-reverse > ... >> xs : (a b c d) >> ys : (0 1 2 3) 1 append-reverse > ... >> xs : (b c d) >> ys : (a 0 1 2 3) 2 append-reverse > ... >> xs : (c d) >> ys : (b a 0 1 2 3) 3 append-reverse > ... >> xs : (d) >> ys : (c b a 0 1 2 3) 4 append-reverse > ... >> xs : nil >> ys : (d c b a 0 1 2 3) 4 append-reverse < ... << VALUE-0 : (d c b a 0 1 2 3) 3 append-reverse < ... << VALUE-0 : (d c b a 0 1 2 3) 2 append-reverse < ... << VALUE-0 : (d c b a 0 1 2 3) 1 append-reverse < ... << VALUE-0 : (d c b a 0 1 2 3) 0 append-reverse < ... << VALUE-0 : (d c b a 0 1 2 3)

なお、ysのリストの要素の順番は変化していません。ysが空の場合は、reverseと同じ挙動になります。

cl

1(append-reverse '(a b c d) '()) 2→ (d c b a)

投稿2021/05/06 19:56

編集2021/05/06 20:19
g000001

総合スコア65

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Amateur0845

2021/05/07 00:05

返信ありがとうございます。 関数の書き方に不備がありました。 append関数 reverse関数 の2つの関数定義です。 朝早くからお時間いただいたのにもかかわらず申し訳ございません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問