diff options
| author | Gerd Moellmann | 1999-10-28 12:12:47 +0000 |
|---|---|---|
| committer | Gerd Moellmann | 1999-10-28 12:12:47 +0000 |
| commit | f2be36717160ed8f947c720cbacc8fea7f80a514 (patch) | |
| tree | 968118d3e26c287fb6f14adf4620085746fee106 /src | |
| parent | 40d63d1feee77cd064dba63ee9dd3b39f51bb2e0 (diff) | |
| download | emacs-f2be36717160ed8f947c720cbacc8fea7f80a514.tar.gz emacs-f2be36717160ed8f947c720cbacc8fea7f80a514.zip | |
(Fmemq, Fassq, Frassq, assq_no_quit, Fassoc)
(Frassoc): Rewritten.
Diffstat (limited to 'src')
| -rw-r--r-- | src/fns.c | 234 |
1 files changed, 168 insertions, 66 deletions
| @@ -148,13 +148,17 @@ To get the number of bytes, use `string-bytes'") | |||
| 148 | XSETFASTINT (val, XVECTOR (sequence)->size & PSEUDOVECTOR_SIZE_MASK); | 148 | XSETFASTINT (val, XVECTOR (sequence)->size & PSEUDOVECTOR_SIZE_MASK); |
| 149 | else if (CONSP (sequence)) | 149 | else if (CONSP (sequence)) |
| 150 | { | 150 | { |
| 151 | for (i = 0, tail = sequence; !NILP (tail); i++) | 151 | for (i = 0; CONSP (sequence); ++i) |
| 152 | { | 152 | { |
| 153 | QUIT; | 153 | if ((i & 0xff) == 0) |
| 154 | tail = Fcdr (tail); | 154 | QUIT; |
| 155 | sequence = XCDR (sequence); | ||
| 155 | } | 156 | } |
| 156 | 157 | ||
| 157 | XSETFASTINT (val, i); | 158 | if (!NILP (sequence)) |
| 159 | wrong_type_argument (Qlistp, sequence); | ||
| 160 | |||
| 161 | val = make_number (i); | ||
| 158 | } | 162 | } |
| 159 | else if (NILP (sequence)) | 163 | else if (NILP (sequence)) |
| 160 | XSETFASTINT (val, 0); | 164 | XSETFASTINT (val, 0); |
| @@ -1314,21 +1318,33 @@ The value is actually the tail of LIST whose car is ELT.") | |||
| 1314 | } | 1318 | } |
| 1315 | 1319 | ||
| 1316 | DEFUN ("memq", Fmemq, Smemq, 2, 2, 0, | 1320 | DEFUN ("memq", Fmemq, Smemq, 2, 2, 0, |
| 1317 | "Return non-nil if ELT is an element of LIST. Comparison done with EQ.\n\ | 1321 | "Return non-nil if ELT is an element of LIST.\n\ |
| 1318 | The value is actually the tail of LIST whose car is ELT.") | 1322 | Comparison done with EQ. The value is actually the tail of LIST\n\ |
| 1323 | whose car is ELT.") | ||
| 1319 | (elt, list) | 1324 | (elt, list) |
| 1320 | register Lisp_Object elt; | 1325 | Lisp_Object elt, list; |
| 1321 | Lisp_Object list; | ||
| 1322 | { | 1326 | { |
| 1323 | register Lisp_Object tail; | 1327 | while (1) |
| 1324 | for (tail = list; !NILP (tail); tail = XCDR (tail)) | ||
| 1325 | { | 1328 | { |
| 1326 | register Lisp_Object tem; | 1329 | if (!CONSP (list) || EQ (XCAR (list), elt)) |
| 1327 | tem = Fcar (tail); | 1330 | break; |
| 1328 | if (EQ (elt, tem)) return tail; | 1331 | |
| 1332 | list = XCDR (list); | ||
| 1333 | if (!CONSP (list) || EQ (XCAR (list), elt)) | ||
| 1334 | break; | ||
| 1335 | |||
| 1336 | list = XCDR (list); | ||
| 1337 | if (!CONSP (list) || EQ (XCAR (list), elt)) | ||
| 1338 | break; | ||
| 1339 | |||
| 1340 | list = XCDR (list); | ||
| 1329 | QUIT; | 1341 | QUIT; |
| 1330 | } | 1342 | } |
| 1331 | return Qnil; | 1343 | |
| 1344 | if (!CONSP (list) && !NILP (list)) | ||
| 1345 | list = wrong_type_argument (Qlistp, list); | ||
| 1346 | |||
| 1347 | return list; | ||
| 1332 | } | 1348 | } |
| 1333 | 1349 | ||
| 1334 | DEFUN ("assq", Fassq, Sassq, 2, 2, 0, | 1350 | DEFUN ("assq", Fassq, Sassq, 2, 2, 0, |
| @@ -1336,20 +1352,41 @@ DEFUN ("assq", Fassq, Sassq, 2, 2, 0, | |||
| 1336 | The value is actually the element of LIST whose car is KEY.\n\ | 1352 | The value is actually the element of LIST whose car is KEY.\n\ |
| 1337 | Elements of LIST that are not conses are ignored.") | 1353 | Elements of LIST that are not conses are ignored.") |
| 1338 | (key, list) | 1354 | (key, list) |
| 1339 | register Lisp_Object key; | 1355 | Lisp_Object key, list; |
| 1340 | Lisp_Object list; | ||
| 1341 | { | 1356 | { |
| 1342 | register Lisp_Object tail; | 1357 | Lisp_Object result; |
| 1343 | for (tail = list; !NILP (tail); tail = XCDR (tail)) | 1358 | |
| 1359 | while (1) | ||
| 1344 | { | 1360 | { |
| 1345 | register Lisp_Object elt, tem; | 1361 | if (!CONSP (list) |
| 1346 | elt = Fcar (tail); | 1362 | || (CONSP (XCAR (list)) |
| 1347 | if (!CONSP (elt)) continue; | 1363 | && EQ (XCAR (XCAR (list)), key))) |
| 1348 | tem = XCAR (elt); | 1364 | break; |
| 1349 | if (EQ (key, tem)) return elt; | 1365 | |
| 1366 | list = XCDR (list); | ||
| 1367 | if (!CONSP (list) | ||
| 1368 | || (CONSP (XCAR (list)) | ||
| 1369 | && EQ (XCAR (XCAR (list)), key))) | ||
| 1370 | break; | ||
| 1371 | |||
| 1372 | list = XCDR (list); | ||
| 1373 | if (!CONSP (list) | ||
| 1374 | || (CONSP (XCAR (list)) | ||
| 1375 | && EQ (XCAR (XCAR (list)), key))) | ||
| 1376 | break; | ||
| 1377 | |||
| 1378 | list = XCDR (list); | ||
| 1350 | QUIT; | 1379 | QUIT; |
| 1351 | } | 1380 | } |
| 1352 | return Qnil; | 1381 | |
| 1382 | if (CONSP (list)) | ||
| 1383 | result = XCAR (list); | ||
| 1384 | else if (NILP (list)) | ||
| 1385 | result = Qnil; | ||
| 1386 | else | ||
| 1387 | result = wrong_type_argument (Qlistp, list); | ||
| 1388 | |||
| 1389 | return result; | ||
| 1353 | } | 1390 | } |
| 1354 | 1391 | ||
| 1355 | /* Like Fassq but never report an error and do not allow quits. | 1392 | /* Like Fassq but never report an error and do not allow quits. |
| @@ -1357,79 +1394,144 @@ Elements of LIST that are not conses are ignored.") | |||
| 1357 | 1394 | ||
| 1358 | Lisp_Object | 1395 | Lisp_Object |
| 1359 | assq_no_quit (key, list) | 1396 | assq_no_quit (key, list) |
| 1360 | register Lisp_Object key; | 1397 | Lisp_Object key, list; |
| 1361 | Lisp_Object list; | ||
| 1362 | { | 1398 | { |
| 1363 | register Lisp_Object tail; | 1399 | while (CONSP (list) |
| 1364 | for (tail = list; CONSP (tail); tail = XCDR (tail)) | 1400 | && (!CONSP (XCAR (list)) |
| 1365 | { | 1401 | || !EQ (XCAR (XCAR (list)), key))) |
| 1366 | register Lisp_Object elt, tem; | 1402 | list = XCDR (list); |
| 1367 | elt = Fcar (tail); | 1403 | |
| 1368 | if (!CONSP (elt)) continue; | 1404 | return CONSP (list) ? XCAR (list) : Qnil; |
| 1369 | tem = XCAR (elt); | ||
| 1370 | if (EQ (key, tem)) return elt; | ||
| 1371 | } | ||
| 1372 | return Qnil; | ||
| 1373 | } | 1405 | } |
| 1374 | 1406 | ||
| 1375 | DEFUN ("assoc", Fassoc, Sassoc, 2, 2, 0, | 1407 | DEFUN ("assoc", Fassoc, Sassoc, 2, 2, 0, |
| 1376 | "Return non-nil if KEY is `equal' to the car of an element of LIST.\n\ | 1408 | "Return non-nil if KEY is `equal' to the car of an element of LIST.\n\ |
| 1377 | The value is actually the element of LIST whose car equals KEY.") | 1409 | The value is actually the element of LIST whose car equals KEY.") |
| 1378 | (key, list) | 1410 | (key, list) |
| 1379 | register Lisp_Object key; | 1411 | Lisp_Object key, list; |
| 1380 | Lisp_Object list; | ||
| 1381 | { | 1412 | { |
| 1382 | register Lisp_Object tail; | 1413 | Lisp_Object result, car; |
| 1383 | for (tail = list; !NILP (tail); tail = XCDR (tail)) | 1414 | |
| 1415 | while (1) | ||
| 1384 | { | 1416 | { |
| 1385 | register Lisp_Object elt, tem; | 1417 | if (!CONSP (list) |
| 1386 | elt = Fcar (tail); | 1418 | || (CONSP (XCAR (list)) |
| 1387 | if (!CONSP (elt)) continue; | 1419 | && (car = XCAR (XCAR (list)), |
| 1388 | tem = Fequal (XCAR (elt), key); | 1420 | EQ (car, key) || !NILP (Fequal (car, key))))) |
| 1389 | if (!NILP (tem)) return elt; | 1421 | break; |
| 1422 | |||
| 1423 | list = XCDR (list); | ||
| 1424 | if (!CONSP (list) | ||
| 1425 | || (CONSP (XCAR (list)) | ||
| 1426 | && (car = XCAR (XCAR (list)), | ||
| 1427 | EQ (car, key) || !NILP (Fequal (car, key))))) | ||
| 1428 | break; | ||
| 1429 | |||
| 1430 | list = XCDR (list); | ||
| 1431 | if (!CONSP (list) | ||
| 1432 | || (CONSP (XCAR (list)) | ||
| 1433 | && (car = XCAR (XCAR (list)), | ||
| 1434 | EQ (car, key) || !NILP (Fequal (car, key))))) | ||
| 1435 | break; | ||
| 1436 | |||
| 1437 | list = XCDR (list); | ||
| 1390 | QUIT; | 1438 | QUIT; |
| 1391 | } | 1439 | } |
| 1392 | return Qnil; | 1440 | |
| 1441 | if (CONSP (list)) | ||
| 1442 | result = XCAR (list); | ||
| 1443 | else if (NILP (list)) | ||
| 1444 | result = Qnil; | ||
| 1445 | else | ||
| 1446 | result = wrong_type_argument (Qlistp, list); | ||
| 1447 | |||
| 1448 | return result; | ||
| 1393 | } | 1449 | } |
| 1394 | 1450 | ||
| 1395 | DEFUN ("rassq", Frassq, Srassq, 2, 2, 0, | 1451 | DEFUN ("rassq", Frassq, Srassq, 2, 2, 0, |
| 1396 | "Return non-nil if ELT is `eq' to the cdr of an element of LIST.\n\ | 1452 | "Return non-nil if KEY is `eq' to the cdr of an element of LIST.\n\ |
| 1397 | The value is actually the element of LIST whose cdr is ELT.") | 1453 | The value is actually the element of LIST whose cdr is KEY.") |
| 1398 | (key, list) | 1454 | (key, list) |
| 1399 | register Lisp_Object key; | 1455 | register Lisp_Object key; |
| 1400 | Lisp_Object list; | 1456 | Lisp_Object list; |
| 1401 | { | 1457 | { |
| 1402 | register Lisp_Object tail; | 1458 | Lisp_Object result; |
| 1403 | for (tail = list; !NILP (tail); tail = XCDR (tail)) | 1459 | |
| 1460 | while (1) | ||
| 1404 | { | 1461 | { |
| 1405 | register Lisp_Object elt, tem; | 1462 | if (!CONSP (list) |
| 1406 | elt = Fcar (tail); | 1463 | || (CONSP (XCAR (list)) |
| 1407 | if (!CONSP (elt)) continue; | 1464 | && EQ (XCDR (XCAR (list)), key))) |
| 1408 | tem = XCDR (elt); | 1465 | break; |
| 1409 | if (EQ (key, tem)) return elt; | 1466 | |
| 1467 | list = XCDR (list); | ||
| 1468 | if (!CONSP (list) | ||
| 1469 | || (CONSP (XCAR (list)) | ||
| 1470 | && EQ (XCDR (XCAR (list)), key))) | ||
| 1471 | break; | ||
| 1472 | |||
| 1473 | list = XCDR (list); | ||
| 1474 | if (!CONSP (list) | ||
| 1475 | || (CONSP (XCAR (list)) | ||
| 1476 | && EQ (XCDR (XCAR (list)), key))) | ||
| 1477 | break; | ||
| 1478 | |||
| 1479 | list = XCDR (list); | ||
| 1410 | QUIT; | 1480 | QUIT; |
| 1411 | } | 1481 | } |
| 1412 | return Qnil; | 1482 | |
| 1483 | if (NILP (list)) | ||
| 1484 | result = Qnil; | ||
| 1485 | else if (CONSP (list)) | ||
| 1486 | result = XCAR (list); | ||
| 1487 | else | ||
| 1488 | result = wrong_type_argument (Qlistp, list); | ||
| 1489 | |||
| 1490 | return result; | ||
| 1413 | } | 1491 | } |
| 1414 | 1492 | ||
| 1415 | DEFUN ("rassoc", Frassoc, Srassoc, 2, 2, 0, | 1493 | DEFUN ("rassoc", Frassoc, Srassoc, 2, 2, 0, |
| 1416 | "Return non-nil if KEY is `equal' to the cdr of an element of LIST.\n\ | 1494 | "Return non-nil if KEY is `equal' to the cdr of an element of LIST.\n\ |
| 1417 | The value is actually the element of LIST whose cdr equals KEY.") | 1495 | The value is actually the element of LIST whose cdr equals KEY.") |
| 1418 | (key, list) | 1496 | (key, list) |
| 1419 | register Lisp_Object key; | 1497 | Lisp_Object key, list; |
| 1420 | Lisp_Object list; | ||
| 1421 | { | 1498 | { |
| 1422 | register Lisp_Object tail; | 1499 | Lisp_Object result, cdr; |
| 1423 | for (tail = list; !NILP (tail); tail = XCDR (tail)) | 1500 | |
| 1501 | while (1) | ||
| 1424 | { | 1502 | { |
| 1425 | register Lisp_Object elt, tem; | 1503 | if (!CONSP (list) |
| 1426 | elt = Fcar (tail); | 1504 | || (CONSP (XCAR (list)) |
| 1427 | if (!CONSP (elt)) continue; | 1505 | && (cdr = XCDR (XCAR (list)), |
| 1428 | tem = Fequal (XCDR (elt), key); | 1506 | EQ (cdr, key) || !NILP (Fequal (cdr, key))))) |
| 1429 | if (!NILP (tem)) return elt; | 1507 | break; |
| 1508 | |||
| 1509 | list = XCDR (list); | ||
| 1510 | if (!CONSP (list) | ||
| 1511 | || (CONSP (XCAR (list)) | ||
| 1512 | && (cdr = XCDR (XCAR (list)), | ||
| 1513 | EQ (cdr, key) || !NILP (Fequal (cdr, key))))) | ||
| 1514 | break; | ||
| 1515 | |||
| 1516 | list = XCDR (list); | ||
| 1517 | if (!CONSP (list) | ||
| 1518 | || (CONSP (XCAR (list)) | ||
| 1519 | && (cdr = XCDR (XCAR (list)), | ||
| 1520 | EQ (cdr, key) || !NILP (Fequal (cdr, key))))) | ||
| 1521 | break; | ||
| 1522 | |||
| 1523 | list = XCDR (list); | ||
| 1430 | QUIT; | 1524 | QUIT; |
| 1431 | } | 1525 | } |
| 1432 | return Qnil; | 1526 | |
| 1527 | if (CONSP (list)) | ||
| 1528 | result = XCAR (list); | ||
| 1529 | else if (NILP (list)) | ||
| 1530 | result = Qnil; | ||
| 1531 | else | ||
| 1532 | result = wrong_type_argument (Qlistp, list); | ||
| 1533 | |||
| 1534 | return result; | ||
| 1433 | } | 1535 | } |
| 1434 | 1536 | ||
| 1435 | DEFUN ("delq", Fdelq, Sdelq, 2, 2, 0, | 1537 | DEFUN ("delq", Fdelq, Sdelq, 2, 2, 0, |