• ベストアンサー

emacs lisp で オブジェクトが list か判断したい

scheme でいうと list? は pair? のようなことがしたいです。 aproposを見ると char-or-string-p など ナントカ-p っていう名前かなぁと思って調べたつもりですが分かりませんでした。 もともとやりたかった事は、flattenで構造化されたリストをフラットにしたかったのですが、これも見つからなかったので リストなのかの判断がしたい という流れです。 こっちが分かる場合でも教えていただけると助かります。

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

  • ベストアンサー
  • KnKn9898
  • ベストアンサー率31% (40/127)
回答No.1

http://www.math.s.chiba-u.ac.jp/~matsu/lisp/emacs-lisp-intro-jp_2.html listpって、ありませんでしたっけ?

hi-mi-tsu
質問者

お礼

ありがとうございます。 コレです。 なんとか -p とハイフン有り で探していたので見付からなかったのだと思います。 (listp 'a) nil (listp 1) nil (listp '()) t (listp '(1)) t コンピュータが使えない環境にいたので回答遅れてしまってすみません。

その他の回答 (1)

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.2

すでに回答がありますが、emacs lispに限らずlispでは「~であるか?」はpで表します。 listp stringp numberp など。 もちろん例外もあって、atom null などはpが付きません(これらは基本関数だし)。 char-or-string-p は、述語が複合語だからpを別単語にしたんだと思います。p は predicate の略です。 flattenの関数そのものはちょっと見当たりませんでした。リスト処理の例題ではよく見かけますけど。

hi-mi-tsu
質問者

お礼

> すでに回答がありますが、emacs lispに限らずlispでは「~であるか?」はpで表します。 この断片的な知識だけはあったのですが > listp stringp numberp など。 ハイフンなしの場合は考えてませんでした。 > もちろん例外もあって、atom null などはpが付きません(これらは基本関数だし)。 なるほど,こういうことですね。 (null nil) t (null 1) nil (null 'a) nil (null '()) t (null '(1)) nil scheme はちょくちょく触っていたりするんですが その他lispについては基本的な部分は良く分かってないので なにかやろうというイメージに対して知識が追い付いてません。。。 > flattenの関数そのものはちょっと見当たりませんでした。リスト処理の例題ではよく見かけますけど。 ここは listp だけあれば実装はできそうなので、 .emacs にでも入れておきます。 ありがとうございました。

関連するQ&A

  • リスト構造のソートで悩んでます。。。

    リスト構造のソートで悩んでます。プログラムの内容はファイルからデータをリスト構造の構造体に読み込み、名前順にソートし結果を表示する。というものです。データの追加や削除はできるのですがソートとなると頭が混乱してしまいお手上げ状態になってしまいました。。。。。 読み込み用のデータとプログラムソースを以下に記載するのでどなたか良きアドバイスをお願いしますm(_ _)m ○データ Sakuragi 16 Rukawa 16 Miyagi 17 Akagi 18 Mitsui 18 ○ソース #include <stdio.h> #include <stdlib.h> #include <string.h> #define MENBER 5 typedef struct data{ char name[BUFSIZ]; int age; struct data *next; }LIST; LIST *newLIST(void); LIST *sort(LIST *); int main(int argc,char *argv[]){ FILE *fp; LIST *p; LIST *np; LIST *npb; LIST *head; char namae[BUFSIZ]; int toshi,i; if((fp=fopen(argv[1],"r"))==NULL){ printf("no file\n"); exit(1); } head = newLIST(); npb =head; for(i=0;i<MENBER;i++){ np = newLIST(); fscanf(fp,"%s %d",namae,&toshi); strcpy(np->name,namae); np->age = toshi; npb->next =np; npb = np; } sort(head); for(p=head->next;p != NULL;p=p->next){ printf("%s\t%d\n",p->name,p->age); } for(p=head->next;p != NULL;p=np){ np = p->next; free(p); } fclose(fp); return(0); } LIST *newLIST(){ LIST *p; p = (LIST *)malloc(sizeof(LIST)); p->next = NULL; return(p); } LIST *sort(LIST *head){ }

  • リスト

    プログラムのデータ構造の勉強を進めてるのですが リストのところである問題がどうしてもリスト(ポインタ)で解けません 基礎的なことがわかるのですが(ノードの使い方などマロックなど) その問題は人の名前を入力し国語、数学、英語の点数を入力して3教科の点数を合計し名前、それぞれの点数、合計の表示、そしてまた入力を続けると指示した場合また名前3教科の点数をいれてと繰り返すのですが、繰り返したときに今まで入っているデータの人々の合計を比較して表示を昇順にしなくちゃなりません。どうすればいいか検討もつきません。 typedef struct _node { char name[10]; int Jap; int math; int eng; struct _node *next; } Node; で構造体はいいのでしょうか? できればくわしくプログラムを教えてください。 お願いします。

  • 線形リストのコードでどーしても理解できない個所があります。

    線形リストのコードでどーしても理解できない個所があります。 (以下、コード部分) typedef struct __node { char name[20]; char tel[16]; struct __node *next; } Node; typedef struct { Node *head; Node *tail; } List; Node *AllocNode(void) { return ((Node *)calloc(1, sizeof(Node))); } /*--- 新たに生成したノードを先頭へ挿入 ---*/ void InsertNode(List *list, const char *name, const char *tel) { Node *ptr = list->head; list->head = AllocNode(); strcpy(list->head->name, name); strcpy(list->haed->tel, tel); list->head->next = ptr; } /*--- pが指すノードの直前にノードを挿入 ---*/ void PutNodeP(List *list, Node *p, const char *name, const char *tel) { if (p == list->head) InsertNode(list, name, tel); else { Node *temp = AllocNode(); if (p == list->tail) list->tail = temp; else *temp = *p; strcpy(p->name, name); strcpy(p->tel, tel); temp->next = p; } } 上の29行目以降の≪pが指すノードの直前にノードを挿入≫についてです。 if文部分については理解できますが、else文部分について、何をやっているのかわからないです。Cの基本的な部分(ポインタも含めて)については充分に理解しているつもりです。 どなたか御教授頂けないでしょうか。 長々と書いてしまいましたがよろしくお願いします。

  • 構造体配列のポインタについて(H17春基本情報試験C言語問題)

    平成17年春基本情報技術者試験の午後問題の問6について、質問があります。 設問dの答えがイなのですが、これがどうしても理解できません。 関数「int word_width(char *str, CHARPROF *char_list)」の「char_list」は構造体の配列のポインタとして宣言されています。 そしてこの関数内の処理を問う穴埋めdの解答は「*str != char_list[idx].char_p」となっています。 char_listは構造体配列のポインタなので、「char_list[idx]->char_p」あるいは「(*char_list[idx]).char_p」となるのでは?と思ったのですが、選択肢にもそれはありません。 char_list配列の先頭アドレスの中身を見るときは「char_list->char_p」となっても、要素番号がつくと、ポインタとはみなさなくなって「char_list[0].char_p」となるのでしょうか? だとするとポインタ宣言したchar_listとポインタ宣言しなかった場合(「CHARPROF char_list」のように普通に変数宣言?した場合)の「char_list[0].char_p」の違いがよくわからないのですが・・・。 念のため、この関数word_widthと構造体CHARPROFを転記します。 アドバイス、よろしくお願いします。 typedef struct {  char char_p; /* 文字 */  int char_w; /* 文字幅(ポイント数) */ } CHARPROF; int word_width(char *str, CHARPROf *char_list) {  int print_w = 0, idx;  while (*str != '\0') {   for (idx = 0; (ここに穴埋め「d」が入る); idx++);   print_w += char_list[idx].char_w;   str++;   }   return print_w; }

  • C言語 list 構造体配列

    どうしてもこの問題がわからないので教えてください!  下記の構造体タグ「seiseki」を使って,表に示すデータをもつ構造体配列「list」を作成する.  関数に構造体配列「list」のアドレスを渡す.  関数で構造体ポインタ「*list」を利用して,一番点 数の高い者(1名限定)を調べ,その名前を表示する. struct seiseki{ char name[30]; int score; name score }; 表 佐藤 80 鈴木 75 田中 95 高橋 90

  • 構造体のリストをソートしたい。

    ある名簿のリストを作りました。 以下のような構造体で、 typedef struct meibo{ char name[10]; int old; struct meibo *next; }MEIBO; これを、ポインタp->next->nameをたどっていって、名前が辞書順になるようにリストを作ったのですが、 これを年齢順にソートして表示させたいんです。 どんな方法があるんでしょうか? 一旦すべてを配列に格納して、クイックソート…とかも考えたのですが、すごく領域をとるし、なんか2度手間(最初から配列に順に格納していけばよかったなぁ・・・と。 それでもやっぱり最初から名列順にするときから配列に入れておくほうがいいのでしょうか? 教えてください。 (最初から年齢を比較してリストを作れば・・ってのはなしで、名列順のリストが存在するものとしてください。)

  • リスト構造がうまく動きません!!

    C言語で以下のようなプログラムを作りました。 「main関数内で下記のデ-タを構造体に格納し、キーボードから入力された名前と該当する学生の身長と年齢を画面に表示するプログラムを作成せよ。」というものです。 このプログラムはコンパイルは通るのですが、2人目以降のデータを表示させようとしても表示してくれません。。。どうもリスト構造のfor文がうまくループしていないみたいなんですが原因が分かりません。どなたか原因の分かる方アドバイスをお願いしますm(_ _)m #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct data{ char name[20]; int height; int age; struct data *next; }person; person *newperson(void); int main(void){ char namae[20],s[20]; int toshi,shinchou,i; person *head; person *list; person *nlist; person *LIST; head = newperson(); nlist = head; printf("データを入れてください。\n"); for(i=0;i<=4;i++){ scanf("%s",namae); scanf("%d",&shinchou); scanf("%d",&toshi); list = newperson(); strcpy(list ->name,namae); list -> height = shinchou; list -> age = toshi; nlist -> next = list; nlist = list; } printf("知りたい人の名前は?\n"); scanf("%s",s); for(LIST = head->next;LIST ->next != NULL;LIST = LIST->next){ if(strcoll(s,LIST ->name)==0){ printf("%s\t%d\t%d\n",LIST->name,LIST->height,LIST->age); break; } printf("%s\n",LIST->name); printf("%s\n",LIST->next->name); } return(0); } person *newperson(){ person *dummy; dummy = (person*)malloc(sizeof(person)); dummy -> next = NULL; return(dummy); }

  • C言語 構造体配列 list

    プログラミングでこの問題がわからないので教えてください! 下記の構造体タグseisekiを使って,表に示すデータをもつ構造体配列listを作成する. 構造体配列listを利用して,一番点数の高い 者を探し,その名前を表示する. struct seiseki{ char name[30]; int score; name score }; 表 佐藤 80 鈴木 75 田中 95 高橋 90

  • 双方向リストの関数

    双方向リストにデータファイルから読み込んだ氏名と成績のデータを追加し,リストの末尾から順にデータを表示するプログラムを作成したのですが、insertLast() 関数を用いて末尾ノードの後ろに新しいノードを連結するという部分をどのようにして良いのかわからず困っています。 どのように記述して良いのかわからなかった部分を/*** ***/のコメントで示してあります。 どなたかアドバイスやヒント、その他の指摘などご教授してくださる方いましたらよろしくお願いします。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define NAME_LENGTH 20 /* 名前を格納する文字列の長さ */ /* 双方向リストのノードとなる構造体の定義 */ typedef struct sList{  struct sList *prev; /* 前のノードのアドレス */  char name[NAME_LENGTH]; /* 名前 */  char grade; /* 成績 */  struct sList *next; /* 次のノードのアドレス */ } sNode; /* この構造体を sNode型 と定義する */ /* 双方向リストの先頭と末尾を格納するための構造体 */ typedef struct {  sNode *firstNode; /* リストの先頭ノードのアドレス */  sNode *lastNode; /* リストの末尾ノードのアドレス */ } manageList; /*  双方向リストの末尾にノードを追加する関数 insertLast()  引数   manageList *list リストの先頭・末尾ノードを管理する構造体のアドレス   sNode *node 末尾に追加したいノードのアドレス  返値   なし */ void insertLast(manageList *list, sNode *node ) {  /*** リストの末尾にノードを追加する ***/  return; } /*  双方向リストの新しいノードを作成する関数 makeNewNode()  引数   char *aName 名前(文字列)の先頭アドレス   char aGrade 成績  返値   sNode * 新しく作成したノードの先頭アドレス */ sNode *makeNewNode(char *aName, char aGrade ) {  sNode *pNewData;  /* sNode 型のメモリ領域を確保 */  pNewData = (sNode *) malloc( sizeof(sNode) );  /* 名前と成績のデータを設定する */  strcpy( pNewData->name, aName );  pNewData->grade = aGrade;  pNewData->prev = NULL;  pNewData->next = NULL;  return( pNewData ); } /*  main()  引数   なし  返値   int 正常終了の時 0     異常終了の時 -1 (ファイルの読み込み失敗など) */ int main( void ) {  manageList list; /* リストの先頭・末尾ノードのアドレスを持つ構造体 */  sNode *pNew; /* 新しく作成したノードのアドレスを持つ変数 */  sNode *pNow; /* 現在見ているノードのアドレスを持つ変数 */  FILE *fp; /* データファイルのファイルポインタ */  char name[ NAME_LENGTH ]; /* ファイルから読み込んだ名前を一時的に保持する変数 */  char grade; /* ファイルから読み込んだ成績を一時的に保持する変数 */  /* 初期状態では先頭・末尾ノードともNULL */  list.firstNode = NULL;  list.lastNode = NULL;  /* データファイル exer6.txt を読み込み用に開く.    ファイルが開けなかった場合,エラーメッセージを表示し異常終了する.*/  fp = fopen("exer6.txt","r");  if(NULL == firstNode){   printf( "ファイルが開けませんでした. \n" );   return( -1 );  }  /* データをファイルの最後(EOF)まで読み込み,双方向リストにデータを追加する */  while( EOF != fscanf( fp, "%s %c", name, &grade ) ) {   /* 新しいノードを作成 */   pNew = makeNewNode( name, grade );   /*** insertLast() 関数を用いて末尾ノードの後ろに新しいノードを連結する ***/   pNow->next = pNew ;   pNew->prev = pNow ;   pNow = pNew ;  /* ファイルを閉じる */  fclose( fp );  /* 現在見ているノードを末尾ノードにセットする */  pNow = lastNode  /* 末尾のノードから前のノードへたどりながらデータを出力する */  while( NULL != pNow ) {   /* 出力 */   printf( "%s %c\n", pNow->name, pNow->grade );   /* 現在見ているノードを一つ前のノードにする */   pNow = pNow->prev;  }  return( 0 ); }

  • リスト

    リスト構造にしたいのですがどうすればいいでしょうか。 #include <stdio.h> #include <stdlib.h> #include <string.h> struct toy { char name[10]; int number; struct toy next; }; /*プロトタイプ宣言*/ void omocha_toy(struct toy *x); int main( void ) { struct toy *x; if((x =(struct toy *)malloc(sizeof(struct toy))) == NULL) { fprintf(stderr,"エラー\n"); exit(1); } sprintf("x -> name,"Osarusan"); x->score = 12; omocha_toy(x); return 0; } void omocha_toy(struct toy *x) } printf("%s",x->name); printf("%d\n",x->number); } このプログラムで2つ目3つ目をリスト構造を使って作りたいんです。 お願いします。