Svante在另一个答案中显示字符串指示符,这让我大吃一惊:
(string= :& "&") -> T看看CLHS,他们说A designator is an object that denotes another object.很好,但是由于这些是不同的对象,所以需要在某个地方进行某种强制。我的意思是,如果下面的列表指示符可以由‘非零原子’来满足,那么某些逻辑就存在于处理这个问题的某个地方。
列表指示符n.对象列表的指示符;即表示列表的对象,它是:非零原子(表示元素为非零原子的单例列表)或适当的列表(表示其本身)。
我认为命名器只是一个概念,例如,泛型函数..。但下面是CLHS的台词..。
除非另有说明,在表示对象可能被多次使用的情况下,它取决于对象是否仅被胁迫一次,或者每次必须使用对象时是否发生强制。
..。使之看起来很具体。
所以我的问题
干杯
发布于 2014-12-11 19:10:04
指示符只不过是一个指定另一个对象的对象。它们的语言没有什么特别之处;命名器的概念只是使某些编程实践变得更容易的概念。术语表上说:
代号 n.表示另一个对象的对象。在操作符的字典条目中,如果参数被描述为类型的指示符,则对运算符的描述是以假定已经发生了对该类型的适当强制的方式编写的;也就是说,该参数已经是所表示的类型。有关更多详细信息,请参见第1.4.1.5节(设计人员)。
指向该部分的链接很有帮助:
1.4.1.5设计人员 指示符是表示另一个对象的对象。 如果将运算符的参数描述为指示符,则运算符的描述将以假定参数的值是已表示的对象的方式编写;也就是说,参数已经是所表示的类型。(由“type”指示符或“类型指示符”表示的对象的特定性质可以在“type”的Glossary条目中找到。)
能够在词汇表中查找有用的东西。例如,字符串指示符可以代表字符串:
字符串指示符 n.一个字符串的指示符;也就是说,一个表示字符串的对象,它是一个字符(表示将字符作为其唯一元素的单个字符串)、一个符号(表示其名称的字符串)或一个字符串(表示其本身)。其意图是该术语与字符串的行为一致;扩展字符串的实现必须以兼容的方式扩展该术语的含义。
该标准还碰巧定义了函数字符串,该函数获取由字符串指示符指定的字符串:
返回由x描述的字符串;特别是:
这简化了必须使用字符串和字符串之类的东西的函数的实现。例如,您可以定义一个make-person函数,该函数接受一个字符串指示符:
(defun make-person (name)
"Return a person with the name designated by NAME."
(list :name (string name)))
(defun person-name (person)
"Return the name of a person (a string)."
(getf person :name))指示符的概念只不过是一种编程约定,使定义灵活的API变得更容易。公共Lisp被定义为一种语言,用于统一一组现有的Lisp,并且它可能是统一不同实现的行为的更容易的方法之一。
在案例中有一个列表指示符的概念
列表指示符 n.对象列表的指示符;即表示列表的对象,它是:非零原子(表示元素为非零原子的单例列表)或适当的列表(表示自身)。
案例键格式{正规-子句}*否则-子句=>结果* 常规-子句::=(键形式*) 键-对象列表的标识符。在这种情况下,符号t和其他符号不能用作键指示符。若要将这些符号本身称为键,则必须分别使用指示符(t)和(否则)。
我不知道有一个函数返回列表指示符指定的列表,但是编写起来非常容易(这不能处理t和的特殊行为,否则case需要其他的,但它通常处理列表指示符):
(defun to-list (x)
"Return the list designated by x."
(if (listp x) x
(list x)))这样的约定有时会在您自己的代码中很有用,特别是当您定义有“注册中心”的东西的时候。例如,如果你写过以下任何一篇文章:
(defmacro deftransform (name &rest args)
`(setf (gethash ',name *transforms*)
(make-transform ,@args)))
(defmacro deftransform (name &rest args)
(setf (get ',name 'transform) (make-transform ,@args)))然后,您可以将转换指示符的概念定义为转换对象或符号(它在*transforms*表中指定符号的值,或符号上的transform属性值)。例如:
(defun transform (x)
(if (transformp x) x
(gethash name *transforms*)))
(defun transform (x)
(if (transformp x) x
(get x 'transform)))这可能会使代码的部分更易于使用。函数指示符相似。
发布于 2014-12-11 17:20:22
什么
对象的指示符不一定是对象,但可以从中推断对象。任何物体都会以琐碎的方式标明自己。
例如,character不是a的(子类型) string,但有时可以使用character代替string,因为它表示一个单字符字符串。
如何:系统级
实现会做不同的事情,查看它们各自的源代码。您可以在下面找到类似于使用级代码之类的东西。
(defun human-address (human)
(etypecase human
(human ...)
(string (human-address (gethash human *humanity*)))))甚至是
(defun human-address (human)
(when (stringp human)
(setq human (gethash human *humanity*)))
(unless (human-p human)
(error ...))
...)如果defgeneric由于引导问题而不可用,或者作为优化而被避免。
如何:用户级别
系统级指示符不是用户可扩展的.也就是说,您不能定义您自己的包或字符串指示符。
但是,您可以为自己的类型定义自己的标识符,例如:
(defclass human ...)
(defvar *humanity* (make-hash-table ...))
(defgeneric human-address (human)
(:method ((human human))
...)
(:method ((name string))
(human-address (gethash name *humanity*))))在这里,string充当human的指示符。
发布于 2014-12-17 10:39:48
对象指示符通常包括多种类型的对象来表示或命名预期的对象。
良好的指示符定义不包括nil (即允许而不是指定对象),有不相交的指示符类型,而且这些指示符通常是指向目标的名称或对象。
注意:在我看来,指示符是不必要的快捷方式,在使用REPL或原型时非常有用。
以下是非详尽的主观分类指示符列表。
良好的指示符(本质上,非零,命名或容器,指示符):
不太好的代号:
with-open-file (或类似的)中使用的路径名是有用的,因此这里的汇合点丢失了。
但是,这样的函数可能应该分为两个部分,一个显式地接受流指示符,另一个显式地接受路径名指示符。string-upcase切换到nstring-upcase。错误的代号:
(nil)的标识符。nil代表标准可读性,您不能而不是指定可读的。否则,不显眼的nil不会发出错误信号。nil用作上下文敏感的指示符,在这种情况下不能而不是指定流。否则,不显眼的nil不会发出错误信号。https://stackoverflow.com/questions/27427925
复制相似问题