assoc関数と同じ動作をする関数(ただし、文字列も扱えるようにする)を作成したいと考えています
具体的には、
(setq S '(("1" "a")("2" "b")))
とあったときに、自作した関数(assoc_mojiとします)
(assoc_moji "1" S)
と実行したら
("1" "a")
となるような関数です
また、無い場合はnilを返します
条件分岐で関数を組み込み、成功した場合は結果を返し
そのほかの場合はnilを返すというところまではわかりますが、
その条件分岐で定義する式が全くわかりません。
memberや、equalを使って、リストに含まれていれば、または指定した文字列が一緒ならば、返すなどしましたがまったくうまくいきませんでした。
どなたか、こういう関数を使ってこういう処理をさせればよいという風なヒントだけでもいいので、ご教授お願いします
No.4ベストアンサー
- 回答日時:
多分、再帰の考え方を使って作って欲しいんじゃないかと思います。
試してみたところ、cond, null, car, cdr, equal, assoc_moji でできますね。
基本的な再帰の考え方は、「リストを下って見ていく」というものです。
(assoc_moji key lst)の形で使用するとして、
まずは、lstの先頭要素(上の例で言うところの("1" "a")の部分;car部)が条件に当てはまるかどうかを見ます。当てはまればその要素を返せばよい。
当てはまらなかった場合は、lstの先頭以外の部分(上の例で言うところの(("2" "b"))の部分;cdr部)に対して同じ捜索をかけて、その結果として返ってくるものを返せば良い。
という考え方です。
実際のプログラムとしては、
・lst が空なら nil を返す
・lst のひとつ目の要素を見て、それが条件に当てはまるなら、その要素を返す
・上記以外の場合は、lstのcdr部に関して再帰
色々省略しましたが、再帰の考え方が伝わりましたら幸いです。
丁寧な説明ありがとうございます。
おかげさまで理解し、解けることができました!
質問に答えてくれた方、本当にありがとうございました!
No.3
- 回答日時:
まあ, なんかの課題なんじゃないでしょうか>#2.
いちおう
(defun assoc_moji (&rest x) (apply #'assoc x))
で動くかもしれんけど反則だよなぁ.
この回答への補足
返信ありがとうございます
恥ずかしながら、その通り(課題)です^^;
試行錯誤しましたが、どうしても解けなかったので質問させていただきました。
ちなみに私の書いたソースは以下です
(defun assoc_moji(x d)
(cond
((member x (first d) :test #'equal) (assoc x (first d) :test #'equalp))
(t nil)
)
)
(member)のところを(equal)に置き換えたりしてみましたが、うまくいきませんでした。
また、(member)を外して(assoc)だけにしても見ましたがどれもエラーが出てうまくいきませんでした。
No.2
- 回答日時:
文字列として等しいかどうかは equal で判定できるはずなので、
>memberや、equalを使って、ストに含まれていれば、または指定した文字列が一緒ならば、返すなどしましたがまったくうまくいきませんでした。
というのなら具体的にどう書いてダメだったかを補足してもらうが早いでしょう。
と、#1のTacosanさんと同じ意見。
(eql "foo" "foo")
nil
(equal "foo" "foo")
t
というかLispがCommon-Lispを指しているのなら、自分で定義するまでもないはずなんだけど。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excel のユーザー定義関数でソルバーが動作しない 1 2022/09/05 19:51
- Excel(エクセル) Excel 値を返す数式についてです 3 2022/11/21 20:08
- PostgreSQL 数値が定期的にあらわれる文字列から、いくつめに出現した数値が指定して切り出したい 1 2023/06/08 13:12
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- Excel(エクセル) エクセル 関数について質問です。 2 2022/10/03 11:14
- Excel(エクセル) 【画像あり】A1が●+B1と同じ文字がB列にある+C1と同じ文字がC列にある場合D1に〇を付ける 3 2023/03/09 18:18
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- Visual Basic(VBA) VBA GetAttrについて教えてください 2 2022/12/22 15:25
- Java Java 南京錠 2 2023/02/04 11:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JavaScriptでクリップボードの...
-
マイページはどこを開くの
-
エクセルのシート上に別のシー...
-
デジタル時計の時刻合わせの方...
-
ウインドウを毎回同じ位置、大...
-
Javascript_submit()完了後に処...
-
VBA ポップアップが表示された...
-
エクセルVBAでフォームのListbo...
-
PDFを(htmlのように)無限に縦...
-
リストビューをスクロールさせ...
-
ブラウザ Chromeを使っていて、...
-
デスクトップ画面を4分割するには
-
「Cancel = True」とはどういう...
-
ポップアップウィンドウがブロ...
-
Excelでワードアートや図を常に...
-
Windowsのポップアップの表示方...
-
VBの画面で、全ウィンドウを一...
-
別フォームから戻ったときのイ...
-
【Android】ユーザー補助機能ボ...
-
親ウィンドウから開いた子ウィ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ajax
-
(VBS) テキストファイル読込で...
-
VC++のデバッガでvectorの要素...
-
PL/Iについて、教えてください。
-
WebサイトのHTMLオブジェクトの...
-
JQuery、セレクトボックスをル...
-
VBA HTTPを用いたWEB画面の取...
-
AJAXでのinputもしくはoptionな...
-
【VB.NET】HTML要素を取得しよ...
-
どこまでを動的に、どこまでを...
-
モーダルウィンドウにおける処...
-
MFCを使って、ひとつのkey(CStr...
-
[C++] vector<string> の各要素...
-
JavaScriptでクリップボードの...
-
ファンクションキーの既存の機...
-
スプレッドシートのチェックボ...
-
bxSliderで動画をスライドごと...
-
【VBA/HTML】特定のタグ要素に...
-
エクセルでタグの内容が取得で...
-
マイページはどこを開くの
おすすめ情報