精华内容
参与话题
问答
  • Scheme语言入门

    千次阅读 2019-05-17 10:42:28
    4.6.1.Scheme语言入门 最早听说 LISP,是 Stallman 的 GNU Emacs 中将 LISP 作为嵌入语言,定制和增强 Emacs。GNU Emacs 是一个文本编辑器,文本就是一种符号,而 Lisp 正好就是针对符号计算发明的,因此在GNU ...

    4.6.1. Scheme语言入门

    最早听说 LISP,是 Stallman 的 GNU Emacs 中将 LISP 作为嵌入语言,定制和增强 Emacs。GNU Emacs 是一个文本编辑器,文本就是一种符号,而 Lisp 正好就是针对符号计算发明的,因此在GNU Emacs 中使用 Lisp 是顺理成章的事情。

    Lisp 语言的历史已经很久了,几乎与 Fortran 一样长。二十世纪五十年代,计算机科学家先是发明了针对数字计算的 Fortran 语言,后来针对符号计算,由MIT 的John McCarthy于1960年开发出了Lisp(List processing)语言。该语言原来是为表处理而设计的编程语言,后来广泛用于处理人工智能问题。Lisp 程序中充满了一对对嵌套的小括号,这些嵌套的符号表达式体现着递归。递归是数学上的基本概念之一,从递归理论出发,一切可以计算的函数最终都可以划归为几种基本的递归函数的种种组合。

    1994年时众多 Lisp 版本又得到了相当的统一,统一之后的版本称为Common LISP。Common Lisp 含有非常丰富的库,仅仅语言的规范就长达千页以上,包括面向对象的 CLOS。

    Scheme 语言是 Lisp 的一个现代变种、方言,诞生于1975年,由 MIT 的 Gerald J. Sussman and Guy L. Steele Jr. 完成。Scheme语言的规范很短,总共只有50页,甚至连Common Lisp 规范的索引的长度都不到,但是却被称为是现代编程语言王国的皇后。它与以前和以后的 Lisp 实现版本都存在一些差异,但是却易学易用。

    DSSSL需要完成的工作是解析文档,它的设计就采用了Scheme语言。本书时介绍DocBook的专著,因此并不打算写一个Scheme大全,只是想通过蜻蜓点水的介绍使读者认识Scheme,能够达到看懂和简单的修改DSSSL。

    4.6.1.1. Scheme特点

    Scheme语言具有它独特的魅力,看看Scheme的语法特点:

    • 括号嵌套

      Lisp 程序中充满了一对对嵌套的小括号,这些嵌套的符号体现了最基本的数学思想——递归。

    • 语法简洁

      Scheme语言的规范很短,总共只有50页。

    • 函数编程语言

      一个函数(Function)是这个编程语言中所谓的第一等的公民。也就是说函式可以像一个 int 或者 float 一样被很方便的传递来传递去。这也就是所谓"Functional 编程语言"中,Functional 一词的由来。

    • 自动内存管理

      自动内存管理可不是JAVA的专利呦。

    • 可移植性好

      Scheme开发的程序有很好的可移植性,这是由于Scheme是一种解释语言,在不同的平台都可以有相应的解释器。

    • 适合于作为脚本语言和嵌入语言

      语法简洁,这使得Scheme的实现可以非常的经济,一个Scheme解释器可以非常的小巧。Scheme可以作为脚本语言而内嵌于一些工具之中,如:GNU Emacs。

    其他特点还有,关键字对大小写不敏感。

    4.6.1.2. 数据结构

    • 数字

      下面都是合法的数字表示方法:47,1/3,2.3,4.3e14,1+3i。

    • 字符

      字符前面需要用#\做前缀。如下面都是合法字符:

      #\a #\A #\b #\B #\space #\newline

    • 字符串

      由双引号括起来的字符组成字符串。如:"A little string"

    • 布尔值

      布尔值True和False分别用 #t 和 #f 表示。

    • 列表

      用圆括号括起来的,可以包含任何数据类型的称为列表。如: (a little (list of) (lists))

    • 数组(vector)

      用#为前缀,如: #(1 2 "string" #\x 5)

    • 函数(或称为过程)

      把函数作为一种数据类型,是Scheme语言的特色。

    • 符号

      符号除了不能够以数字开头的任何字符可组成符号。如:Symbols: this-is-a-symbol foo a32 c$23*4&7+3-is-a-symbol-too!

    4.6.1.3. 表达式和函数

    4.6.1.3.1. 注释

    分号开始一段注释。如:

    (+ 3 1) ;return 4
    

    4.6.1.3.2. 常量表达式

    1. 常量表达式

      常量表达式返回本身的值。如:

      3.14	; 返回 3.14
      #t	; 返回布尔值 #t
      #\c	; 返回字符 #\c
      "Hi!"	; 返回字符串 "Hi!"
      
    2. 引用(Quotation)

      语法:(quote obj) 或者简写为 'obj

      (+ 2 3)  	; 返回 5
      '(+ 2 3) 	; 返回列表 (+ 2 3)
      (quote (+ 2 3)) ; 返回列表 (+ 2 3)
      

    4.6.1.3.3. 表达式记法

    Scheme的表达式的写法有些特别,表达式用括号括起来。括号里面的第一个出线的是函数名或者操作符,其它是参数。Scheme的这种表达式写法可以叫做前置式。下面是一些Scheme的表达式的例子以及其对应的C语言的写法。

      Scheme                               C
    ------------------------------------------------------------------
    (+ 2 3 4)                       (2 + 3 + 4) 
    (< low x high)                  ((low < x) && (x < high)) 
    (+ (* 2 3)                      (* 4 5)) ((2 * 3) + (4 * 5)) 
    (f x y)                         f(x, y) 
    (define (sq x) (* x x))         int sq(int x) { return (x * x) } 
    
    

    4.6.1.3.4. 赋值和函数定义

    1. let 表达式和赋值

      语法:(let ((var val) ...) exp1 exp2 ...)

      说明:let 表达式的赋值只在表达式内部有效。

      示例:

      (let ((x 2) (y 3)) (+ x y))
      

      ; 先赋值: x=2, y=3,再计算x+y的值,结果为5。注意 (x 2) 和 (y 3) 外还有一层括号。

      更多的示例:

      (let ((f +))
        (f 2 3))  ; return 5 
      
      (let ((f +) (x 2))
        (f x 3))  ; return 5 
      
      (let ((f +) (x 2) (y 3))
        (f x y))  ; return 5 
      
    2. 用define 和 set! 赋值

      语法:(define var exp) , (set! var exp)

      说明:define和 set! 表达式的赋值在全局有效。define 和 set! 的区别是define既能赋值又能定义变量,而set!只能对已经定义的变量赋值。

      示例:

      (define a 1)	 
      a				; return 1
      (set! a 2)
      a				; return 2
      (let ((a 3)) a) 		; return 3
      a				; return 2
      (let ((a 3)) (set! a 4) a)	; return 4
      a				; return 2
      (let ((a 3)) (define a 5) a)	; return 5
      a				; return 2
      (set! b 1)			; 错误,b尚未定义
      
      

       

    3. lambda 表达式和函数定义

      语法:(lambda (var ...) exp1 exp2 ...)

      说明:lambda 表达式用于定义函数。var ... 是参数,exp1 exp2 ...是函数的执行 部分。通常需要结合局部定义 let 或者全局定义表达式 define,再进行函数调用。

      示例:

      ((lambda (x) (+ x x)) (* 3 4))  ; return 24
      

      说明:先用lambda定义了函数,参数是x,函数返回x+x。同时该语句也完成了函数调用,实参是 12 (等于3*4),因此返回值是 24 (等于12+12)。

    4. 在let表达式中定义函数。

      Scheme语言中,函数作为一种数据类型,通过赋值语句,将lambda表达式赋值给相应的函数。

      示例:

      (let ((double (lambda (x) (+ x x))))
        (list (double (* 3 4))
              (double (/ 99 11))
              (double (- 2 7))))     ; return (24 18 -10) 
      

      说明:let表达式将lambda定义的函数赋值给double,参数是x,返回 x+x。接下来分别三次调用 double 函数,并将结果以列表形式返回。list 表达式负责生成列表。

    5. 用define全局定义表达式来定义函数。

      用 let 定义的函数只能在 let 表达式中有效,如果想定义在整个程序中有效的函数定义,需要用到全局定义表达式——define。

      示例:

      (define double (lambda (x) (+ x x)))
      (double 12)            ; return 24
      (double (* 3 4))       ; return 24
      

      说明:define表达式定义了全局有效的函数 double。两次调用double的返回值都是 24。

    6. 定义函数的简写

      用 define 定义的函数的语法可以简化,即将 lambda 去掉。即将语法

      (define var0
        (lambda (var1 ... varn)
          e1 e2 ...)) 
      

      简写为:

      (define (var0 var1 ... varn)
        e1 e2 ...) 
      

      示例:

      (define (double x) (+ x x))
      (double 12)            ; return 24
      (double (* 3 4))       ; return 24
      

      说明:本例是前一个例子的简化版本。更简介,明了。

    4.6.1.3.5. 顺序计算表达式

    语法:(begin exp1 exp2 ...)

    说明:顺序执行表达式 exp1, exp2, ...,返回最后一个表达式的结果

    示例:

    (define x 3)
    (begin
      (set! x (+ x 1))
      (+ x x))             ; 返回结果 8
    

    说明:begin 表达式,依次先用set!表达式为x赋值为4,在运算x+x,返回结果8。

    4.6.1.3.6. 条件表达式

    1. 关系运算符

      (< -1 0)  		#t
      (> -1 0)  		#f 
      (eqv? 'a 'a) 		#t
      
      
    2. 逻辑运算

      (not #t)  		#f
      (not #f) 		#t 
      
      (not 1)  		#f
      (not '(a b c))  	#f 
      
      
      (or)  			#f
      (or #f)  		#f
      (or #f #t)  		#t
      (or #f 'a #f)  		a 
      
      (and)  			#t
      (and #f)  		#f
      (and #f #t)  		#f
      (and #f 'a #f)  	#f
      (and 'a #t 'b)		'b
      
    3. if 表达式

      语法:(if test consequent alternative)

      说明:如果test表达式为真,返回 consequent,否则返回 alternative。

      示例:

      (define (abs n)
          (if (< n 0)
              (- 0 n)
              n)) 
      
      

      说明:函数abs功能为取绝对值。

    4. cond 表达式

      语法:(cond (test exp) ... (else exp))

      说明:多路分支判断表达式,类似于C语言的 "if ... else if ... else"。

      示例:

      (define abs
        (lambda (n)
          (cond
            ((= n 0) 0)
            ((< n 0) (- 0 n))
            (else n)))) 
      
      

      说明:用cond表达式重新实现取绝对值函数 abs。

    5. case 表达式

      语法:(case exp0 clause1 clause2 ... )

      clause 的语法结构为:((key1 ...) exp1 ...) 最后一个表达式的结构可以为:(else exp1 exp2 ...)

      说明:类似于C语言的 "switch ... case..." 语句。

      示例:

      (let ((x 4) (y 5))
        (case (+ x y)
          ((1 3 5 7 9) 'odd)
          ((0 2 4 6 8) 'even)
          (else 'out-of-range)))
      ; 返回 odd
      

      说明:case 表达式先计算 x+y 的值为9,接下来在key中进行匹配,并返回对应的表达式的值 'odd。

    4.6.1.3.7. 循环

    1. do 表达式

      语法:(do ((var1 val1 update1) ...) (test res ...) exp ...)

      说明:类似于C语言的for循环。先将val1赋值给var1,...,之后循环开始,在每次循环的开始,先执行表达式 test,如果返回布尔值真,则循环终止,并返回结果 res,如果表达式 test返回布尔值#f,则运行表达式 exp...,之后依次用 update1 ... 的值来为变量 var1 ... 重新赋值。

      示例1:计算阶乘 n! = n*(n-1)!

      (define factorial
        (lambda (n)
          (do ((i n (- i 1)) (a 1 (* a i)))
              ((zero? i) a)))) 
      
      (factorial 10)  ; 返回 3628800 
      

      说明:其对应的C语言实现如下

      long factorial(int n)
      {
      	int  i=n;
      	long a=1;
      	
      	for (i=n;; i--)
      	{
      		if (i == 0)
      			return a;
      		a *= i;
      	}
      }
      

      示例2:计算fibonacci数列:f(n+1)=f(n)+f(n-1) , n>0, f(1)=1, f(0)=0

      (define fibonacci
        (lambda (n)
          (if (= n 0)
              0
              (do ((i n (- i 1)) (a1 1 (+ a1 a2)) (a2 0 a1))
                  ((= i 1) a1))))) 
      
      (fibonacci 6)  ; 返回 8
      

      说明:其对应的C语言实现如下

      long fibonacci(int n)
      {
      	long f=1;
      	
      	int i = n;
      	int a1= 1;
      	int a2= 0;
      	
      	if (n == 0)
      		return 0;
      	while(1)
      	{
      		if (i == 1)
      			return a1;
      		i--;
      		a1=a1+a2;
      		a2=a1;
      	}
      }
      
    2. map 表达式

      语法:(map procedure list1 list2 ...)

      说明:列表 list1 list2 ... 必须具有同样的长度;过程 procedure 接受的参数个数同列表的个数,各个列表中对应的变量分别作为过程 procedure 的参数被执行, 将每次的运算结果以列表形式返回。

      (map abs '(1 -2 3 -4 5 -6)) 	; 返回 (1 2 3 4 5 6),abs接受一个参数
      
      (map (lambda (x y) (* x y))
           '(1 2 3 4)
           '(8 7 6 5))		返回(8 14 18 20) ,lambda (x y) 接收两个参数
      
    3. for-each 表达式

      语法:(for-each procedure list1 list2 ...)

      说明:同 map表达式, 但是不返回结果列表。

     

     

    原文1:http://www.worldhello.net/doc/docbook_howto/ar01s04s06.html

    原文2:https://my.oschina.net/zhoukuo/blog/349453

    展开全文
  • Scheme协议详细介绍

    2018-08-03 15:08:09
    1.URL Scheme使用场景介绍 2.URL Scheme基础介绍 2.1 什么是URL Scheme? 2.2 URL Scheme协议格式解释 2.3 Scheme链接格式样式 3.URL Scheme如何使用 3.1 设置Scheme 3.2 获取Scheme跳转的参数,并添加跳转...
        

    目录介绍

    • 1.URL Scheme使用场景介绍
    • 2.URL Scheme基础介绍

      • 2.1 什么是URL Scheme?
      • 2.2 URL Scheme协议格式解释
      • 2.3 Scheme链接格式样式
    • 3.URL Scheme如何使用

      • 3.1 设置Scheme
      • 3.2 获取Scheme跳转的参数,并添加跳转方式
      • 3.3 调用方式
      • 3.4 如何判断一个Scheme是否有效
      • 3.5 Scheme在短信息中注意要点

    关于Scheme应用案例

    关于链接

    1.URL Scheme使用场景介绍

    • URL Scheme使用场景,目前1,2,5使用场景很广,有没有一种熟悉的感觉?

      * 1.通过小程序,利用Scheme协议打开原生app
      * 2.H5页面点击锚点,根据锚点具体跳转路径APP端跳转具体的页面
      * 3.APP端收到服务器端下发的PUSH通知栏消息,根据消息的点击跳转路径跳转相关页面
      * 4.APP根据URL跳转到另外一个APP指定页面
      * 5.通过短信息中的url打开原生app
      

    2.URL Scheme基础介绍

    2.1 什么是URL Scheme?

    • android中的scheme是一种页面内跳转协议,是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便跳转app中的各个页面

    2.2 URL Scheme协议格式

    String urlStr="http://www.ycbjie.cn:80/yc?id=hello&name=cg";
    //url =            protocol + authority(host + port) + path + query
    //协议protocol=    http
    //域名authority=   www.ycbjie.cn:80
    //页面path=          /yc
    //参数query=       id=hello&name=cg
    //authority =      host + port
    //主机host=        www.ycbjie.cn
    //端口port=        80

    2.3 Scheme链接格式样式

    • 样式:[scheme]://[host]/[path]?[query]

    3.URL Scheme如何使用

    3.1 设置Scheme

    • 在AndroidManifest.xml中对标签增加设置Scheme
    <activity
        android:name=".ui.main.ui.activity.SchemeFirstActivity"
        android:screenOrientation="portrait">
        <!--Android 接收外部跳转过滤器-->
        <!--要想在别的App上能成功调起App,必须添加intent过滤器-->
        <intent-filter>
            <!-- 协议部分配置 ,注意需要跟web配置相同-->
            <!--协议部分,随便设置 yc://ycbjie:8888/from?type=yangchong  -->
            <data android:scheme="yc"
                android:host="ycbjie"
                android:path="/from"
                android:port="8888"/>
    
    
            <!--下面这几行也必须得设置-->
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <action android:name="android.intent.action.VIEW" />
        </intent-filter>
    </activity>

    3.2 获取Scheme跳转的参数,并添加跳转方式

    public class SchemeFirstActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Uri uri = getIntent().getData();
            if (uri != null) {
                //获取指定参数值
                String type = uri.getQueryParameter("type");
                Log.e( "UrlUtils","main: " + type);
    
                if(type.equals("yangchong")){
                    ActivityUtils.startActivity(GuideActivity.class);
                }else if(type.equals("main")){
                    ActivityUtils.startActivity(MainActivity.class);
                }
            }
            finish();
        }
    }

    3.3 调用方式

    • 3.3.1 原生调用
    Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("yc://ycbjie:8888/from?type=yangchong"));
    startActivity(intent);
    • 3.3.2 网页调用
    <a href="yc://ycbjie:8888/from?type=yangchong">打开叮咚app</a>
    • 3.3.3 短信息中调用

    3.4 如何判断一个Scheme是否有效

    PackageManager packageManager = getPackageManager();
    Intent intent = new Intent(Intent.ACTION_VIEW,
            Uri.parse("yc://ycbjie:8888/from?type=yangchong"));
    List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
    boolean isValid = !activities.isEmpty();
    if (isValid) {
        startActivity(intent);
    }

    3.5 Scheme在短信息中注意要点

    • 设置android:scheme="http"或者android:scheme="https"后,点击短信息或者h5页面,发现没有跳到指定的页面,反而打开的是网页链接。

    关于我的博客

    展开全文
  • 最美丽的编程语言Scheme——基本表达式

    万次阅读 热门讨论 2010-10-27 23:24:00
    Scheme被很多人誉为“世界上最美丽的编程语言”。偶也被他们的话所打动,于是乎开始了Scheme之旅。 目前Scheme大多用于科研,商用的比较少。但即便如此,也丝毫不会影像其“美丽”。 下面就请大家一起跟我走进...

    Scheme被很多人誉为“世界上最美丽的编程语言”。偶也被他们的话所打动,于是乎开始了Scheme之旅。

    目前Scheme大多用于科研,商用的比较少。但即便如此,也丝毫不会影像其“美丽”。

    下面就请大家一起跟我走进Scheme的世界罢。

     

    玩Scheme与其它编程语言一样,需要一个开发环境。我们可以通过Google搜索到MIT-GNU-Scheme。它有Windows版、Linux版以及Mac OS X版。基于你们所用的操作系统下载相应的版本。我用过Windows版和Mac OS X版,其实界面都一样——都是控制台。

    我们进入程序后,可以通过按下Ctrl+h,然后再按t,来看向导。这里教你如何使用这个工具。

    我们先按下Ctrl+x,然后按下b,然后进入Scheme表达式计算模式。

     

    下面就让我们看看Scheme的一个最简单的表达式:1 + 2

    我们在工具中输入:

     

    然后我们按下Ctrl+x ,再按下Ctrl+e,然后我们可以看到输出:

    ; Value: 3

     

    我们后面每一句表达式都要用Ctrl+x,Ctrl+e进行计算一次。

     

    我们通过第一个程序示例看到,Scheme的表达式是前缀表达式,也就是说把运算符放在最左侧。这样做的有点是可以定义带任意个数的实参过程。

    在Scheme中,与C/C++这样的命令式语言一样,将0,346,-3.5等数值作为最基本的表达式。而上面的(+ 1 2)则已经属于复合表达式了。

    我们下面再列出一些更复杂的表达式:

     

    Scheme也是属于解释性语言,因此它具有很多动态特性。

    而其中一点就是可以自动识别实数和整数。比如:

     

    我们通过上述代码可以获悉数值类型会由解释器动态识别。这里值得我们注意的是第二句,输出的是3/2,而不是1。这样有利于保持精度。

     

    下面我们将介绍Scheme中如何定义一个变量。在Scheme中定义一个变量,在概念上是将该变量与表达式关联起来。比如我们定义一个x为2:

     

    其实在语义上是指将x与表达式2关联起来。我们看看定义好x后,将它与其它表达式结合起来:

     

    我们可以看到之前保留的整数的乘法,遇到实数后,其精度依然保留。

     

    下一章,我们将学习一下如何用Scheme定义过程。

    展开全文
  • Scheme定义 Scheme 编程语言是一种Lisp方言,诞生于1975年,由 MIT 的 Gerald J. Sussman 和 Guy L. Steele Jr. 完成。它是现代两大Lisp方言之一;另一个方言是Common Lisp。 Scheme遵循极简主义哲学,以一个小型...

    Scheme定义

    Scheme 编程语言是一种Lisp方言,诞生于1975年,由 MIT 的 Gerald J. Sussman 和 Guy L. Steele Jr. 完成。它是现代两大Lisp方言之一;另一个方言是Common Lisp

    Scheme遵循极简主义哲学,以一个小型语言核心作为标准,加上各种强力语言工具(语法糖)来扩展语言本身。

    MIT曾用Scheme作为计算机系入门课程的编程语言。计算机程序语言界著名的魔法书《计算机程序的构造和解释》(又称SICP)正是利用Scheme来解释程序设计。

    历史悠久的Scheme依然活跃,拥有针对各种计算机平台和环境的实现,例如RacketGuile、MIT Scheme、Chez Scheme等。Guile是GNU工具体系里最重要的部件之一,被许多自由软件和开源软件作为内置脚本语言使用。

    历史与特点:

    Lisp 语言历史悠久,在计算机程序语言里,年龄仅次于Fortran。二十世纪五十年代,计算机科学家先是发明了针对数字计算的 Fortran 语言,后来针对符号计算,由MIT 的John McCarthy于1960年开发出了Lisp (list processing)语言。该语言起初为表处理而设计,后来广泛用于人工智能。Lisp 程序中充满了一对对嵌套的小括号,这些嵌套的符号表达式体现了递归。1994年时众多Lisp版本得到了相当的统一,统一之后的版本称为Common LISPCommon Lisp带有庞大的函数库,语言的规范长达千页以上,包括面向对象的 CLOS。

    Scheme语言的规范很短,总共只有50页,甚至连Common Lisp 规范的索引的长度都不到,但是却被称为是现代编程语言王国的皇后。它与以前和以后的 Lisp 实现版本都存在一些差异。现特征如下:

    (1)括号嵌套:Lisp 程序中充满了一对对嵌套的小括号,这些嵌套的符号体现了最基本的数学思想——递归

    (2)语法简洁:Scheme语言的规范很短,总共只有50页。

    (3)函数编程语言

    一个函数(Function)是这个编程语言中所谓的第一等的公民。也就是说函式可以像一个 int 或者 float 一样被很方便的传递来传递去。这也就是所谓“Functional编程语言”中,Functional 一词的由来。

    (4)自动内存管理

    (5)支持尾递归:提高了递归效率

    (6)continuation

    (7)可移植性好

    Scheme开发的程序有很好的可移植性,这是由于Scheme在不同的计算机平台有相应的解释器和编译器。

    (8)脚本语言

    由于scheme语法简洁,一个Scheme解释器可以非常的小巧。Scheme可以作为脚本语言而内嵌于一些工具之中。

    (9)数据结构

    I.数字

    下面都是合法的数字表示方法:47,1/3,2.3,4.3e14,1+3i。

    II.字符

    字符前面需要用#\做前缀。如下面都是合法字符:#\a #\A #\b #\B #\space #\newline

    III.字符串:由双引号括起来的字符组成字符串。如:"A little string"

    IV布尔值:布尔值True和False分别用 #t 和 #f 表示。

    V.列表:用圆括号括起来的,可以包含任何数据类型的称为列表。如:(a little (list of) (lists))

    VI.数组(vector):用#为前缀,如:#(1 2 "string" #\x 5)

    VII.函数(或称为过程):把函数作为一种数据类型,是包括Scheme语言在内的Lisp的特色。

    VIII.符号

    符号除了不能够以数字开头的任何字符可组成符号。如:Symbols: this-is-a-symbol foo a32 c$23*4&7+3-is-a-symbol-too!

    IX.注释 分号开始一行注释。 如:(+ 3 1) ;return 4

    Scheme应用实例

    今天小编给大家讲解的这个例子是关于shareinstall的。我们知道,Shareinstall其实是一个APP的推广辅助工具,它主要的作用就是进行渠道统计。另外,它还提供了免填二维码、一键跳转、自动渠道打包、自动建立社区关系等功能。而scheme语言主要应用在一键跳转功能上。

    以IOS SDK为例,ShareInstall通过标准的scheme、universal link等技术,在app安装的情况下,从各种浏览器(微信、QQ、新浪微博、钉钉等主流社交软件的内置浏览器)唤醒 app 并传递自定义参数,避免重复安装。

    我们可以从universal link配置作为载体,去观察scheme的活跃性。如下:

    Universal link是iOS9的一个新特性,通过Universal link,App可以通过各种浏览器跳转到App(例如微信内可不通过safari,一键跳转到App),真正实现一键跳转到相应界面。 备注:iOS9以上推荐使用Universal link。

    (1)配置developer.apple.com的相关信息 

    到苹果开发者中心,为当前的App ID开启Associated Domains服务: 

    (2)配置Xcode

    在Xcode中配置ShareInstall为当前应用生成的关联域名:Associated Domains 开关打开,添加 Domains:applinks:f6bkarebhf22eb.shareinstall.com

     在AppDelegate中的continueUserActivity方法中调用,用来处理Universal link。

    //Universal Links 通用链接
    - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler
    {
        //判断是否通过ShareInstall Universal Links 唤起App
        if ([ShareInstallSDK continueUserActivity:userActivity]) {
            return YES ;
        }else{
            //其他代码
            return YES;
        }
    }
    

    (3)配置App的URL Scheme

    iOS系统中App之间是相互隔离的,通过URL Scheme, App之间可以相互调用,并且可以传递参数。 备注:iOS9以下通过Url Scheme实现拉起。

    (4) 在Xcode里选中Target—Info—URL Types, 配置shareInstall为当前应用生成的Url Scheme,如图所示:

    identifier 配置为 com.ShareInstall,URL Schemes从shareInstall获取(dekf0466)。 注:identifier 一定要配置为com.ShareInstall 

    (5) URL Scheme相关代码配置

    注意:当需要在shareInstall这个方法中处理第三方回调的时候(比如支付宝、微信回调等),请注意区分。

    //iOS9以下 URI Scheme
    -(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
    
        //判断是否通过ShareInstall URL Scheme 唤起App
        if ([ShareInstallSDK handLinkURL:url]) {
             return YES;
        }else{
            //其他代码
            return YES;
        }
    
        return YES;
    }
    
    //iOS9以上 URL Scheme
    - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(nonnull NSDictionary *)options
    {
        //判断是否通过ShareInstall URL Scheme 唤起App
        if ([ShareInstallSDK handLinkURL:url]) {
    
            return YES;
        }else{
            //其他代码
            return YES;
        }
    
        return YES;
    }

    (6)获取唤醒参数,直达具体页

    通过在url中附带具体的参数,唤醒app并跳转到具体页。

    - (void)getWakeUpParamsFromSmartInstall: (id) params withError: (NSError *) error{
    NSLog(@"唤醒参数params=%@",params);
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"URL shceme 进来的" message:[self DataTOjsonString:params] delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
    //弹出提示框(便于调试,调试完成后删除此代码)
    [alert show];
    }

    (7) 其他代码配置

    如果做测试,获取参数,则必须在Appdelegate.h加上如下测试代码。

    #pragma mark 将oc数据类型转成NSString
    -(NSString *)DataTOjsonString:(id)object
    {
        if (!object) {
            return null;
        }
    
        NSString *jsonString = null;
        NSError *error;
        NSData *jsonData = [NSJSONSerialization dataWithJSONObject:object
                                                           options:NSJSONWritingPrettyPrinted
                                                             error:&error];
        if (! jsonData) {
            NSLog(@"Got an error: %@", error);
        } else {
    jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
        }
        return jsonString;
    }

    一键跳转的优势

    通过 URL Scheme 和 Universal Links 实现了在不同浏览器中拉起APP。这样Shareinstall SDK就减少了应用的代码冗余,提供了通用的一键拉起接口,使用户有了更加舒适的体验,同时给移动开发者对自己产品的管理和推广,也提供了便利。

     

    展开全文
  • Scheme 语言概要(上)

    万次阅读 2015-08-27 18:06:45
    作为Lisp 变体,Scheme 是一门非常简洁的计算语言,使用它的编程人员可以摆脱语言本身的复杂性,把注意力集中到更重要的问题上,从而使语言真正成为解决问题的工具。本文分为上、 下两部分来介绍 scheme 语言。 ...
  • 前提:需要在指定的页面的清单文件中进行配置 ...--scheme 是可以随便指定的,只是入口处调用这个就行--> android:scheme="test" /> <!--这个是必须要写--> <action android...
  • 常用第三方APP 的url scheme

    万次阅读 2018-09-28 16:10:30
    amp;tid=8941179       设置:prefs:root=SETTING 触宝拨号:dialer:// 蜂窝网络:prefs:root=MOBILE_DATA_SETTINGS_ID  WIFI:prefs:root=WIFI(WIFI这几个字母一定要大写)  定位服务:prefs:...
  • scheme简明教程

    2018-04-06 13:34:21
    这是一本在国外比较有名的Scheme编程语言的入门教材。本教材适合任何对Scheme编程语言感兴趣的人阅读,尤其是有其他编程语言(特别是动态语言)编程经验,希望快速了解Scheme的不同点并且快速上手写点东西的人。
  • 使用shceme跳转支付宝指定页面,从支付宝APK提取出来,key的数字就是scheme的said,自行替换即可,json里有部分是之前的支付宝的活动页面,跳转了会提示已暂停服务 //扫一扫 alipayqr://platformapi/startapp?saId=...
  • Scheme协议详细介绍

    千次阅读 2018-08-03 14:23:16
    1.URL Scheme使用场景介绍 2.URL Scheme基础介绍 2.1 什么是URL Scheme? 2.2 URL Scheme协议格式解释 2.3 Scheme链接格式样式 3.URL Scheme如何使用 3.1 设置Scheme 3.2 获取Scheme跳转的参数,并添加跳转...
  • Scheme

    千次阅读 2016-08-25 12:50:59
    Scheme是一种函数式编程语言,是Lisp的两种主要方言之一(另一种为Common Lisp)。不同于Common Lisp,Scheme遵循极简主义哲学,以一个小型语言核心作为标准,加上各种强力语言工具(语法糖)来扩展语言本身。麻省...
  • Scheme

    万次阅读 2019-10-02 19:20:47
    ●有点像面向对象的写法^-^ ●闭包? (define counter (let ([next 0]) (lambda () (set! next (+ next 1)) next))) (counter) (counter) ...(define make-counter (lambda () (let ([count 0]) ...
  • Scheme 介绍

    万次阅读 2019-06-03 05:20:12
    最近一直在看 sicp 这本书,准备写点读书笔记,这篇当作是对 Scheme 语言的介绍,毕竟全书是用这门语言写的。 下面是我对书中使用的 mit-scheme 的一些理解,我没有正统学习过函数式或类 Lisp 语言,只有一些我自己...
  • Scheme

    2016-07-29 14:05:30
    scheme学习
  • scheme 语言概述

    千次阅读 2015-10-07 02:13:27
    Scheme语言是LISP语言的一个方言(或说成变种),它诞生于1975年的MIT,对于这个有近三十年历史的编程语言来 说,它并没有象C++,java,C#那样受到商业领域的青睐,在国内更是显为人知。但它在国外的计算机教育领域内...
  • lisp方言--scheme

    千次阅读 2012-06-10 19:29:39
    Scheme 维基百科,自由的百科全书 跳转到: 导航,搜索 汉漢▼ Scheme 编程范型 多范型 发行时间 1970年代 设计者 盖伊·史提尔二世 和 杰拉德·...
  • Scheme归纳】3 比较do, let, loop

    万次阅读 2015-03-12 14:06:16
    str str)返回#t,因为str本身的地址的是一样的,但是”scheme”和”scheme”则被存储在不同的地址中,因此函数返回#f。注意,不要用eq?来比较数字,因为在R5RS和MIT-Scheme中均没有被指定返回值,建议使用eqv?或者=...
  • 自定义 URL Scheme 完全指南

    千次阅读 2014-05-22 14:41:43
    本文转自 Migrant的博客,原文:...iPhone / iOS SDK 最酷的特性之一就是应用将其自身”绑定”到一个自定义 URL scheme 上,该 scheme 用于从浏览器或其他应用中启动本应用。   注册自定义 URL Scheme 注册
  • Android中使用Scheme协议打开App URL Scheme URL Scheme是一种页面内跳转协议,通过定义自己的URL Scheme协议,可以 从一个APP中打开另外一个APP指定的页面,也可以从H5页面中跳转到APP指定的页面(实际上就是从一个...
  • Scheme入门教程(Yet Another Scheme Tutorial),从网页下载,转成PDF

空空如也

1 2 3 4 5 ... 20
收藏数 176,805
精华内容 70,722
关键字:

scheme