From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Artur Malabarba Newsgroups: gmane.emacs.devel Subject: Re: Merging nth, aref, and elt. Date: Sat, 13 Dec 2014 04:09:51 +0000 Message-ID: References: <87oast997c.fsf@fencepost.gnu.org> <87bnor3eyt.fsf@uwakimon.sk.tsukuba.ac.jp> Reply-To: bruce.connor.am@gmail.com NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 X-Trace: ger.gmane.org 1418443807 24060 80.91.229.3 (13 Dec 2014 04:10:07 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sat, 13 Dec 2014 04:10:07 +0000 (UTC) Cc: "Stephen J. Turnbull" , David Kastrup , emacs-devel To: Stefan Monnier Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sat Dec 13 05:10:00 2014 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1Xze1o-0001Ux-2O for ged-emacs-devel@m.gmane.org; Sat, 13 Dec 2014 05:10:00 +0100 Original-Received: from localhost ([::1]:60214 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xze1n-0003Y0-Hr for ged-emacs-devel@m.gmane.org; Fri, 12 Dec 2014 23:09:59 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:54871) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xze1j-0003Xs-JI for emacs-devel@gnu.org; Fri, 12 Dec 2014 23:09:56 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Xze1i-0007bU-Fr for emacs-devel@gnu.org; Fri, 12 Dec 2014 23:09:55 -0500 Original-Received: from mail-ob0-x22e.google.com ([2607:f8b0:4003:c01::22e]:63111) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xze1g-0007WJ-LD; Fri, 12 Dec 2014 23:09:52 -0500 Original-Received: by mail-ob0-f174.google.com with SMTP id nt9so12248473obb.5 for ; Fri, 12 Dec 2014 20:09:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:reply-to:sender:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=B21BvQJx508wmyq50EGgy5dPQP66+ZigFc4/Szm0Gwg=; b=h8bb7FIKpBdxOOYwEf+Q32IkPbwCAqTtQKFABc/GPgVUuu+EmGrpmzBsYskWhU1zMS zktZGbE4vv8QDF36YviVBTyDha7ANCpTlAlhii7cS4MN62j96K9xUn9Yw9T5QCUkizkB MNSlbS8qKEdxgZVEin1BGMfyE4gxAp6kH2mBgxZXSlmh7KI6NbAozS/Nmu2svSH9TTpQ sUtZvmEOtAsFEOYnjqUbUR0xFOssv4XhOsRinMXeIW6lNB8FIt67x89LgZY7oPY+SpjE m59HYduA7GippdaR7noWDtzN1dg0H3J88EzowotdWzUiYHDXUcXWZtgFa+SWxfbl/djJ lZIQ== X-Received: by 10.202.188.66 with SMTP id m63mr14756oif.26.1418443791764; Fri, 12 Dec 2014 20:09:51 -0800 (PST) Original-Received: by 10.76.154.106 with HTTP; Fri, 12 Dec 2014 20:09:51 -0800 (PST) In-Reply-To: X-Google-Sender-Auth: N65m8udyu0fi6C0hCPhjxh5DVTU X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2607:f8b0:4003:c01::22e X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:179974 Archived-At: Here's an initial diff for hash-tables. Should it use `get' instead of `elt'? (fns.c) elt: Also work on hash-tables (lisp/emacs-lisp/gv.el): Fix setf on `elt' (bytecode.c) exec_byte_code: Add nil arg to Felt call. 3 files changed, 26 insertions(+), 14 deletions(-) lisp/emacs-lisp/gv.el | 7 ++++--- src/bytecode.c | 2 +- src/fns.c | 31 +++++++++++++++++++++---------- Modified lisp/emacs-lisp/gv.el diff --git a/lisp/emacs-lisp/gv.el b/lisp/emacs-lisp/gv.el index a0f92a5..11c35a4 100644 --- a/lisp/emacs-lisp/gv.el +++ b/lisp/emacs-lisp/gv.el @@ -302,7 +302,8 @@ The return value is the last VAL in the list. (gv-define-setter cdar (val x) `(setcdr (car ,x) ,val)) (gv-define-setter cddr (val x) `(setcdr (cdr ,x) ,val)) -(gv-define-setter elt (store seq n) - `(if (listp ,seq) (setcar (nthcdr ,n ,seq) ,store) - (aset ,seq ,n ,store))) +(gv-define-setter elt (store set index) + `(if (listp ,set) (setcar (nthcdr ,index ,set) ,store) + (if (arrayp ,set) (aset ,set ,index ,store) + (puthash ,index ,store ,set)))) (gv-define-simple-setter get put) (gv-define-setter gethash (val k h &optional _d) `(puthash ,k ,val ,h)) Modified src/bytecode.c diff --git a/src/bytecode.c b/src/bytecode.c index d3c8b47..456f23d 100644 --- a/src/bytecode.c +++ b/src/bytecode.c @@ -1843,5 +1843,5 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, BEFORE_POTENTIAL_GC (); v1 = POP; - TOP = Felt (TOP, v1); + TOP = Felt (TOP, v1, Qnil); AFTER_POTENTIAL_GC (); } Modified src/fns.c diff --git a/src/fns.c b/src/fns.c index e891fdb..aabe757 100644 --- a/src/fns.c +++ b/src/fns.c @@ -1355,15 +1355,26 @@ N counts from zero. If LIST is not that long, nil is returned. */) } -DEFUN ("elt", Felt, Selt, 2, 2, 0, - doc: /* Return element of SEQUENCE at index N. */) - (register Lisp_Object sequence, Lisp_Object n) -{ - CHECK_NUMBER (n); - if (CONSP (sequence) || NILP (sequence)) - return Fcar (Fnthcdr (n, sequence)); +DEFUN ("elt", Felt, Selt, 2, 3, 0, + doc: /* Return element of SET at INDEX. +If SET is a list or an array, INDEX is a number and DFLT is ignored. +If SET is a hash table, INDEX is a key. If INDEX is not found, return +DFLT which defaults to nil. */) + (register Lisp_Object set, Lisp_Object index, Lisp_Object dflt) +{ + if (CONSP (set) || NILP (set)) + { + CHECK_NUMBER (index); + return Fcar (Fnthcdr (index, set)); + } + + if (ARRAYP (set)) + { + CHECK_NUMBER (index); + return Faref (set, index); + } - /* Faref signals a "not array" error, so check here. */ - CHECK_ARRAY (sequence, Qsequencep); - return Faref (sequence, n); + /* Fgethash signals a "not hash-table" error, so check here. */ + CHECK_TYPE (HASH_TABLE_P (set), Qsequencep, set); + return Fgethash (index, set, dflt); }