From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: "Pascal J. Bourguignon" Newsgroups: gmane.emacs.devel Subject: Re: Why (substring "abc" 0 4) does not return "abc" instead of an error? Date: Mon, 16 Jul 2012 17:00:42 +0200 Organization: Informatimago Message-ID: <87hat73g4l.fsf@kuiper.lan.informatimago.com> References: <50038E42.1030508@yandex.ru> <87liij3l8f.fsf@kuiper.lan.informatimago.com> <87r4sbeplm.fsf@altern.org> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: dough.gmane.org 1342450875 12742 80.91.229.3 (16 Jul 2012 15:01:15 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Mon, 16 Jul 2012 15:01:15 +0000 (UTC) To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Mon Jul 16 17:01:14 2012 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 1SqmnO-0002Xh-6x for ged-emacs-devel@m.gmane.org; Mon, 16 Jul 2012 17:01:10 +0200 Original-Received: from localhost ([::1]:59386 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SqmnN-0003ng-JH for ged-emacs-devel@m.gmane.org; Mon, 16 Jul 2012 11:01:09 -0400 Original-Received: from eggs.gnu.org ([208.118.235.92]:54055) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SqmnE-0003mY-3s for emacs-devel@gnu.org; Mon, 16 Jul 2012 11:01:08 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SqmnC-0007A7-7g for emacs-devel@gnu.org; Mon, 16 Jul 2012 11:01:00 -0400 Original-Received: from plane.gmane.org ([80.91.229.3]:47773) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SqmnC-00079s-17 for emacs-devel@gnu.org; Mon, 16 Jul 2012 11:00:58 -0400 Original-Received: from list by plane.gmane.org with local (Exim 4.69) (envelope-from ) id 1SqmnB-0002Ii-1t for emacs-devel@gnu.org; Mon, 16 Jul 2012 17:00:57 +0200 Original-Received: from 81.202.16.46.dyn.user.ono.com ([81.202.16.46]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Mon, 16 Jul 2012 17:00:57 +0200 Original-Received: from pjb by 81.202.16.46.dyn.user.ono.com with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Mon, 16 Jul 2012 17:00:57 +0200 X-Injected-Via-Gmane: http://gmane.org/ Original-Lines: 91 Original-X-Complaints-To: usenet@dough.gmane.org X-Gmane-NNTP-Posting-Host: 81.202.16.46.dyn.user.ono.com Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwAQMAAABtzGvEAAAABlBMVEUAAAD///+l2Z/dAAAA oElEQVR4nK3OsRHCMAwF0O8YQufUNIQRGIAja9CxSA55AxZgFO4coMgYrEDDQZWPIlNAjwq9 033pbOBPtbXuB6PKNBn5gZkhGa86Z4x2wE67O+06WxGD/HCOGR0deY3f9Ijwwt7rNGNf6Oac l/GuZTF1wFGKiYYHKSFAkjIo1b6sCYS1sVmFhhhahKQssRjRT90ITWUk6vvK3RsPGs+M1RuR mV+hO/VvFAAAAABJRU5ErkJggg== X-Accept-Language: fr, es, en User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.4 (gnu/linux) Cancel-Lock: sha1:ZmI2MjA1MGQzNmExNDY0MGFlNGYxZWE1NDYyOTRiZTNlMmYwZjlmZg== X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 80.91.229.3 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:151668 Archived-At: Bastien writes: > Hi Pascal, > > "Pascal J. Bourguignon" writes: > >> (defun mysubstring (str start end) >> (substring str (max start 0) >> (if end >> (min end (length str)) >> (length str)))) >> >> and use (mysubstring "abc" 0 4) --> "abc" >> instead of substring. > > I know how to implement my own defun for this but thanks. > > My question was about what _justifies_ the current behavior. First, emacs and lisp were invented long before JS, Ruby, Python, C++ and a lot of other _currently_ popular languages and other languages that were popular but are now forgotten ;-) So emacs and lisp have another, older tradition. If you were to invent a new lisp (or better, just writing a new lisp application or library), then you could design a consistent set of operators with a more "modern" look-and-feel; (the "modern" style spread out in the 20's, it's an old style). Technically, one good reason to signal an error instead of silently clipping the arguments is that exactly it detects an error. Since lisp is a dynamically typed language, the type of the objects is controlled by what the functions accept. If you (or your compiler) formalize the types accepted by the functions, then type inference can be implemented and the program can be (for the most parts) type checked statically too. But even without static type checking with type inference, it's useful to set up such constraints and signal such errors. You could also accept non integer values for start and end. Obviously any real would be good too (but will you truncate or round?). What about complex numbers (if there were complexes in emacs lisp)? Or just what about other objects, what if we pass a string: (mysubstring str "42" "end-2") We can imagine several useful behaviors. But would a library/language that would accept any type of arguments and values for any parameter be really that useful? Have a look at PHP and similar languages that coerce everything everywhere. I'm not sure that entirely helps writing clean and bug-free programs. But mostly the point is that it's a question of language (or DSL, library) design. It's somewhat arbitrary. We can say that the designers of substring (subseq in CL, and similar functions in ancestors of CL and emacs lisp) found that it was useful to signal an error when passing out of bounds arguments. > Dmitry said at least JS, Ruby, Python and perhaps C++ uses > the behavior I mention -- so I'm even more curious now. > > I am not saying the behavior I expect is superior, it is > just the one I expect -- I would like to read a good reason > for the current one. Juanma have a point when he said that > the current behavior is consistent with other *-substring > functions but again, `substring' seems different to me. Well, lisp has this great advantage over other programming languages that it is really very accomodating to your specific needs. Look how emacs lisp provides a cl package with macros and functions similar to those provided in Common Lisp. Similarly, nothing prevents you to write an emacs lisp package with macros and functions having a Javascript, or Ruby or Python or C++ look-and-feel, that would help programmers coming from those languages to more easily adapt and feel more comfortable with emacs lisp, just like cl helps me, a Common Lisp programmer, be more comfortable with emacs lisp. (require 'js) (js-substring "abc" "0" 1000) --> "abc" ; and let JavaScript ; programmers be happy! (just document those functions and macros well, so that other emacs lisp programmers can still understand what's happening). -- __Pascal Bourguignon__ http://www.informatimago.com/ A bad day in () is better than a good day in {}.