• ベストアンサー

LISPで連想配列の操作?

(setq ary '((A . 1) (B . 2) (C . 3))) で、perlでの $ary{'A'}++; や $ary{'B'}='X' や $ary{'C'}=$ary{'A'}+5; ということをさせたいのですが、LISPではどう書くのでしょうか? (assoc 'A ary) 2 (assoc 'B ary) X (assoc 'C ary) 7 という結果が欲しいです。 また、一度にaryの内容を表示させる Data::DumperのようなものはLISPにあるのでしょうか? 処理系はCommon LISPです。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

(setq ary '((A . 1) (B . 2) (C . 3))) (defun sample () ;;(print ary) (setf (cdr (assoc 'A ary)) (1+ (cdr (assoc 'A ary)))) (setf (cdr (assoc 'B ary)) (* 2 (cdr (assoc 'B ary)))) (setf (cdr (assoc 'C ary)) "mogera") ;;(print ary) ) c:\tmp\0519>clisp i i i i i i i ooooo o ooooooo ooooo ooooo I I I I I I I 8 8 8 8 8 o 8 8 I \ `+' / I 8 8 8 8 8 8 \ `-+-' / 8 8 8 ooooo 8oooo `-__|__-' 8 8 8 8 8 | 8 o 8 8 o 8 8 ------+------ ooooo 8oooooo ooo8ooo ooooo 8 Copyright (c) Bruno Haible, Michael Stoll 1992, 1993 Copyright (c) Bruno Haible, Marcus Daniels 1994-1997 Copyright (c) Bruno Haible, Pierpaolo Bernardi, Sam Steingold 1998 Copyright (c) Bruno Haible, Sam Steingold 1999-2000 Copyright (c) Sam Steingold, Bruno Haible 2001-2006 [1]> (load "sss.l") ;; Loading file sss.l ... ;; Loaded file sss.l T [2]> (pprint ary) ((A . 1) (B . 2) (C . 3)) [3]> (pprint #'sample) #<FUNCTION SAMPLE NIL (DECLARE (SYSTEM::IN-DEFUN SAMPLE)) (BLOCK SAMPLE (SETF (CDR (ASSOC 'A ARY)) (1+ (CDR (ASSOC 'A ARY)))) (SETF (CDR (ASSOC 'B ARY)) (* 2 (CDR (ASSOC 'B ARY)))) (SETF (CDR (ASSOC 'C ARY)) "mogera"))> [4]> (sample) "mogera" [5]> (pprint ary) ((A . 2) (B . 4) (C . "mogera")) [6]>

その他の回答 (1)

  • plantarum
  • ベストアンサー率53% (42/79)
回答No.2

以下はxyzzyでの実行結果です。 ---- (setq ary '((A . 1) (B . 2) (C . 3))) ((A . 1) (B . 2) (C . 3)) (mapcar #'(lambda (list) (cond ((eq 'A (car list)) (cons (car list) (1+ (cdr list)))) (t list))) ary) ((A . 2) (B . 2) (C . 3)) ----

関連するQ&A

  • LISPのブロック?処理?

    LISPで (if (条件) (真の処理) (偽の処理) )のうち、 真の処理には1つの関数?しか、書けないのでしょうか? (if (条件) (setq x "○") (setq x "×") ) ======A====== 複数関数書きたい。 Aの部分は(progn ...)とするのでしょうか?

  • LISPの間違いを指摘して欲しいのですが・・・

    (setq a 1) (setq b 2) (setq c 3) (setq d 4) (setq e 5) (setq f 6) (setq g 7) (setq h 8) (setq i 9) (setq j 10) (defun wa(q r s t u v w x y z) (+ q r s t u v w x y z)) (wa a b c d e f g h i j ) 55 1から10までの合計値を求める”LISP”のプログラムを作りたいのですが上記を作ってみましたがうまくいきません。 どこが悪いのでしょうか?

  • lispについて質問です

    assoc関数と同じ動作をする関数(ただし、文字列も扱えるようにする)を作成したいと考えています 具体的には、 (setq S '(("1" "a")("2" "b"))) とあったときに、自作した関数(assoc_mojiとします) (assoc_moji "1" S) と実行したら ("1" "a") となるような関数です また、無い場合はnilを返します 条件分岐で関数を組み込み、成功した場合は結果を返し そのほかの場合はnilを返すというところまではわかりますが、 その条件分岐で定義する式が全くわかりません。 memberや、equalを使って、リストに含まれていれば、または指定した文字列が一緒ならば、返すなどしましたがまったくうまくいきませんでした。 どなたか、こういう関数を使ってこういう処理をさせればよいという風なヒントだけでもいいので、ご教授お願いします

  • 「初めての人のためのLISP[増補改訂版]」で

    「初めての人のためのLISP[増補改訂版]」のP.46の練習問題をやっていくと (setq A nil) nil (setq B '(87 58 90)) (87 58 90) (setq C '(I B M)) (I B M) (null t) nil (null A) t (null (null A)) nil (cadr B) 58 (+ (car B) (caddr B)) 177 (cadr C) B (set (car C) (cdr B)) (58 90) (car C) I (atom C) nil となりますが、 なぜ (atom C) でnilが返ってくるのですか? "C"はアトムではないのですか?

  • 連想配列をループで作成するには

    $ary1 = array("a","b","c"); $ary2 = array("あ","い","う"; から、以下の$aryを作成したいのですが、 ループして、連想配列を作るにはどうしたらよいのでしょうか? $ary = ( "a" => "あ", "i" => "い", "u" => "う", );

    • ベストアンサー
    • PHP
  • 配列の連想配列のソート

    お世話になります。mooTaihenです。 Perlで配列のソートが出来なくて困っております。 お忙しいところ、誠に申し訳けありませんが、ご教示をお願い致します。 【内容】  サンプルソースに示した様なデータ構成をソートしたいのですが、思惑通りに行きません。  期待しているソート結果は、 a1 b3 b4 c2  です。  <サンプルソース> my @data; $data[0]{name} = "b"; $data[0]{cnt} = 4; $data[1]{name} = "c"; $data[1]{cnt} = 2; $data[2]{name} = "b"; $data[2]{cnt} = 3; $data[3]{name} = "a"; $data[3]{cnt} = 1; @data2 = sort {chg($a,$b)} @data; foreach (@data2) { print $_->{name} . $_->{cnt} . "\n"; } sub chg { my(@s,@d)=@_; return $s[0]{name} cmp $d[0]{name} and $s[0]{cnt} <=> $d[0]{cnt}; }  <出力結果> a1 b3 c2 b4

    • ベストアンサー
    • Perl
  • Javascriptの配列の便利な処理

    Javascriptの配列で以下のような処理は自分で作らないといけないのでしょうか? var csv = 'A,B,C,D'; var ary new Array(); ary = csv.split(','); 要素の有無 true/false ary.exists('A') 結果 true 要素の削除 ary.delete('A') 結果 ary = ['B', 'C', 'D'];

  • [VBA] 連想配列について

    こちらの識者の方々にはいつもお世話になっています。 VBAの質問です。 環境は下記になります。 OS=windowsXP SP3 Office=Excel2003(11.8347.8403) SP3 データ量が多いのでVLOOKUPの処理を連想配列を使ってやりたいのですが、できなくて困っています。 言葉では説明しずらいので、やりたいことのコードを提示します。 :Sheet2 品名  1月  2月 りんご 2   3 ばなな 4   5 下記、VBAコード ---------------------------------------------------- Option Explicit Sub test()  Dim oDict As Object  Dim Ary As Variant  Dim EndRow As Long  Dim i As Long  Ary = Sheets("Sheet2").Range("A2:C3").Value  Set oDict = CreateObject("Scripting.Dictionary")  For i = 1 To UBound(Ary)   oDict(Ary(i, 1)) = Ary(i, 2)   oDict(Ary(i, 2)) = Ary(i, 3)  Next i  With ThisWorkbook.Sheets("Sheet1")   EndRow = .Cells(Rows.Count, 1).End(xlUp).Row   Ary = .Range("A1:Y" & EndRow).Value   For i = 2 To EndRow    Ary(i, 24) = oDict(Ary(i, 1))    Ary(i, 25) = oDict(Ary(i, 2))   Next i   .Range("A1:Y" & EndRow) = Ary  End With  MsgBox "done" End Sub ---------------------------------------------------- というコードなのですが、  For i = 1 To UBound(Ary)   oDict(Ary(i, 1)) = Ary(i, 2)   oDict(Ary(i, 2)) = Ary(i, 3)  Next i が、oDict(Ary(i, 1)) = Ary(i, 2)だけ配列に格納される状態です。 指定の文字列(Key)に対応するItemを返すのが連想配列だと思うのですが、上記コードで、 oDict(Ary(1, 1))=2 oDict(Ary(2, 1))=4 oDict(Ary(1, 2))=3 oDict(Ary(2, 2))=5 という配列に格納されない理由がわかりません。 Scripting.Dictionaryで辞書に格納できるデータになにかしらの制限があるのでしょうか? 質問に不備不足等ございましたらご指摘ください。 ご面倒お掛けしますがよろしくお願いします。

  • 【連想配列】配列ごとに表示させたい

    var data = [ { a:"たかし", b:"180cm", c:"70kg" }, { a:"よしお", b:"170cm", c:"60kg" }, { a:"けいこ", b:"160cm", c:"5kg" } ]; 「次へ」ボタンを押すたびによしお、けいこへとデータが入れ替わるようにしたいのですが、どのようにプログラムを組めばいいのでしょうか。 $(".next").click(function(){ for(i = 0; i < data.length; i++){ //a,b,cのデータ表示 } });

  • LISP - (BCD) から B だけを取り出したいです。

    学校でLISPを使ってのプログラミングの宿題が出ました。 初めてなので、わからないことだらけなのですが、 (A BCD)からAを取り出すには (CAR '(A BCD)) で取り出せますよね。 (BCD)からBだけ、もしくはCだけを取り出すにはどうすればよいのでしょうか? どうぞよろしくお願いします。

専門家に質問してみよう