newLISP symbol

初始化symbol

set

syntax: (set sym-1 exp-1 [sym-2 exp-2 ... ])

下面是例子:

> (set ‘mysymbol "ebd")
"ebd"
> (upper-case mysymbol)
"EBD"

上面第一句设置了一个symbol, 值为字符串。

第二句使用该symbol。注意此时无需单引号。

注意:

1. 这里set定义了全局的symbol, 不过只能在当前context下可见。

2 如果有多个sym和exp,则set返回最后一组exp求值的结果

let

如果使用let,则只定义了局部的symbol.

local

local和let差不多,只不过会将所有symbol初始化为nil

sym

动态创建symbol

这应该是本文最重要的部分。lisp的动态特性在这里充分展现。在很多语言里面,你声明一个变量的工作必须在编译期间或者更早之前完成,在运行时声明一个变量是不可能的。而sym允许这样做。

syntax: (sym string [sym-context [nil-flag]])
syntax: (sym number [sym-context [nil-flag]])
syntax: (sym symbol [sym-context [nil-flag]])

你可以在运行时从一个web server获得一个字符串,然后用(sym)将其转变成一个symbol,之后就可以对其赋值。

(set (sym "var") 345)  → 345
var   

动态创建Tree类

这就可以解决我之前的一个问题,我想在运行时从Tree创建一个新的Class的时候,之前的写法是固定的:

(new Tree ‘MyTree)

其实‘MyTree可以在运行时变成若干个,比如在一个循环算法中,变成三个: ‘MyTree1, ‘MyTree2 和 ‘MyTree3

就要靠(sym)来解决:

#!/usr/bin/newlisp

(define (update-tree tree-name key value)
  (let (mm (new Tree (sym tree-name)))
    (mm key value)))

(update-tree "MyTree" "a" 1)
(update-tree "MyTree" "b" 2)

(println ((eval (sym "MyTree")))) ;; (("a" 1) ("b" 2))
(println ((eval (sym "MyTree")) "a")) ;; 1

(set ‘name-list ‘("A" "B"))
(dolist (name name-list)
  (update-tree name "x" 1)
  (update-tree name "y" 2))

(println ((eval (sym (name-list 0))))) ;; (("x" 1) ("y" 2))
(println ((eval (sym (name-list 1))))) ;; (("x" 1) ("y" 2))

(exit)

update-tree 函数是关键,可以指定tree的名称(string类型),然后内部使用sym将tree-name转换成symbol,就可以调用(new Tree ..)了。

注意获得tree的时候需要eval。下面是输出结果:

(("a" 1) ("b" 2))
1
(("x" 1) ("y" 2))
(("x" 1) ("y" 2))

创建不合法的symbol

sym还可以创建在newLISP中原本不合法的symbol,比如:

;; using sym for simulating hash tables

(set (sym "John Doe" ‘MyDB) 1.234)
(set (sym "(" ‘MyDB) "parenthesis open")
(set (sym 12 ‘MyDB) "twelve")

(eval (sym "John Doe" ‘MyDB))  → 1.234
(eval (sym "(" ‘MyDB))         → "parenthesis open"
(eval (sym 12 ‘MyDB))          → "twelve"

;; delete a symbol from a symbol table or hash
(delete (sym "John Doe" ‘MyDB))  → true

delete

注意delete可以删除symbol.

未完待续...

时间: 2024-07-30 18:35:02

newLISP symbol的相关文章

newLISP数据引用

无法返回引用 数据传递包括两种,返回值和参数. 很可惜,newlisp的返回值只进行值拷贝,也就是返回副本,并没有方法返回引用. 那么看看参数吧,通过参数有两种方法传递引用,一种是通过使用单引号,比如: 单引号symbol传递参数引用 (define (change-list aList) (push 999 (eval aList))) (set 'data '(1 2 3 4 5)) ; note the quote ' in front of data (change-list 'data

使用NewLisp设计Key-Value数据库系统

Lisp是一个很好的语言,最强大的就是其S-表达式,可以说是Lisp能活到今天的唯一一个原因.其次就是函数为基本类型和后来的闭包.当然Lisp也有很大的缺点,即:一般的设计师难以避免Lisp的缺点. Lisp有很多方言,很多子系列,可以说百花齐放,也可以说是散沙一盘.这就是Lisp的优点之一,同时也是其缺点之一,但是这些缺点主要是用Lisp的人造成的,而之所以会这样,是因为Lisp太容易滥用了(其缺点正是因为其优点导致的). NewLisp是一个非常强大的Lisp实现,也可以称为一个方言,是一个

newLISP处理mysql escape character

什么是转义字符 mysql的escape character指的是需要转义的特殊字符,这些字符出现在sql语句中,如果没有转移会导致sql语法报错或者有sql注入攻击的可能. 主要有以下几种都需转义: \x00, \n, \r, \, ', " and \x1a. 比如' 就需要变成\' 下面是sql测试: mysql> INSERT INTO nodes(name) VALUES ('select a.dt, count(*), count(distinct a.uv) from (se

ios 中 使用自制framework导致 Duplicate symbol 的问题解决方法

使用第三方静态库的时候有时候要求在编译选项linker 中 other linker flag中加入 -ObjC 但如果自制的framework库工程中加入了-ObjC,在Demo工程中如果也加入-ObjC选项时,可能导致 duplicate sysbol的问题 duplicate symbol _OBJC_CLASS_$_ZHAlixPayResult in: /Users/zizhu/Library/Developer/Xcode/DerivedData/NtUniSdkHaiMaDemo-

caffe日常坑系列之:undefined reference to symbol '_ZN2cv6String10deallocateEv'

在使用caffe库编译C++时出现的 解决如下: /usr/bin/ld: /tmp/ccA5JGRP.o: undefined reference to symbol '_ZN2cv6String10deallocateEv'//usr/local/lib/libopencv_core.so.3.2: error adding symbols: DSO missing from command line解决:sudo apt-get autoremove libopencv-dev caffe

Symbol

ES5 的对象属性名都是字符串,这容易造成属性名的冲突.比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突.如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突.这就是 ES6 引入Symbol的原因 ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值.它是 JavaScript 语言的第七种数据类型,前六种是:undefined.null.布尔值(Boolean).字符串(S

Arcgis Runtime for andriod 100 Simple marker symbol

//create a simple marker symbolSimpleMarkerSymbol symbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 12); //size 12, style of circle //add a new graphic with a new point geometryPoint graphicPoint = new Point(-226773, 6550477

《深入理解ES6》之Symbol

ES6在原有的5中原始类型:字符串.数字型.布尔型.null和undefined的基础上,引入了一种原始类型Symbol(可以通过typeof检测变量是否为Symbol类型). Symbol的使用方法 所有使用可计算属性名的地方,都可以使用Symbol. let firstName=Symbol("first name"); let person={ [firstName]:"jia" }; Object.defineProperty(person,firstNam

解决Eclipse中C++代码显示Symbol 'std' could not be resolved的问题

第一次在Eclipse中写C++代码,写了一个简单的hello world程序,还没有等我编译.就报出了各种错误,但是这么简单的代码.怎么可能这么多错误.于是没有理会.编译执行后,能够正常输出!!!Hello World!!!,但是我的代码中还是有非常多红叉,把鼠标放在上面显示:Symbol 'std' could not be resolved 这种信息. 于是问题来了.怎样解决? 方法:写完库函数以后立刻保存.这样写之后的代码就不会报错了 比如:-->首先写#include <iostre