什么是Scheme?原来还可以这样应用!

Scheme定义

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

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

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

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

历史与特点:
Lisp 语言历史悠久,在计算机程序语言里,年龄仅次于Fortran。二十世纪五十年代,计算机科学家先是发明了针对数字计算的 Fortran 语言,后来针对符号计算,由MIT 的John McCarthy于1960年开发出了Lisp (list processing)语言。该语言起初为表处理而设计,后来广泛用于人工智能。Lisp 程序中充满了一对对嵌套的小括号,这些嵌套的符号表达式体现了递归。1994年时众多Lisp版本得到了相当的统一,统一之后的版本称为Common LISP。Common 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就减少了应用的代码冗余,提供了通用的一键拉起接口,使用户有了更加舒适的体验,同时给移动开发者对自己产品的管理和推广,也提供了便利。

原文地址:https://blog.51cto.com/14686870/2470519

时间: 2024-10-08 18:21:48

什么是Scheme?原来还可以这样应用!的相关文章

Xcode6.4注册URL Scheme步骤详解

URL Scheme的作用 我们都知道苹果手机中的APP都有一个沙盒,APP就是一个信息孤岛,相互是不可以进行通信的.但是iOS的APP可以注册自己的URL Scheme,URL Scheme是为方便app之间互相调用而设计的.我们可以通过系统的OpenURL来打开该app,并可以传递一些参数. 例如:你在Safari里输入www.alipay.com,就可以直接打开你的支付宝app,前提是你的手机装了支付宝.如果你没有装支付宝,应该显示的是支付宝下载界面,点击会跳到AppStore的支付宝下载

(已解决)#warning:尚未配置[微信]URL Scheme:wx4868b35061f87884, 无法使用进行授权。

#warning:尚未配置[微信]URL Scheme:wx4868b35061f87884, 无法使用进行授权. (说白了就是注册白名单) " -canOpenURL: failed for URL: "weixin://app/wx4868b35061f87885/" - error: "This app is not allowed to query for scheme weixin"  " 此error源自iOS9 URL Scheme

Vim Color Scheme

Molokai Color Scheme for Vim I prefer molokai's dark grey background. Installation with Pathogen cd ~/.vim/bundle && \git clone https://github.com/tomasr/molokai.git Now Molokai is installed. Add the following to your vimrc. " Set color schem

全民Scheme(0):lat的定义

接下来我会写一写Scheme的学习笔记.嗯,Scheme是属于小众的语言,但合适用来教学的. 什么是lat,就是遍历list里的每个S-expression,如果发现其中某个不是atom的,则返回false,否则返回true. (define atom? (lambda (x) (and (not (pair? x)) (not (null? x))))) (define lat? (lambda (l) (cond ((null? l) #t) ((atom? (car l)) (lat? (

[Scheme入门]3 高阶函数

 1.高阶函数的介绍 高阶函数的英文名称是Higher Order Function,它们是以函数为参数的函数.主要用于映射(mapping).过滤(filtering).归档(folding)和排序(sorting)表.高阶函数让程序更具模块性,让函数更加通用. 函数sort具有2个参数,一个是需要排序的表,另一个是定序(Ordering)函数.下面展示了按照大小将一个整数表正序排序.而<函数就是本例中函数的定序函数. (sort'(420 -130 138 983 0 298 783 -

scheme 符号求导程序

SICP 习题: #lang scheme ( define ( variable? x ) ( symbol? x ) ) ( define ( same-variable? x y ) ( and ( variable? x ) ( variable? y ) ( eq? x y ) ) ) ( define ( =number? exp num ) ( and ( number? exp ) ( = exp num ) ) ) ;;;;;;;;;;;;;;;;; sum ;;;;;;;;;

spark程序异常:Exception in thread &quot;main&quot; java.io.IOException: No FileSystem for scheme: hdfs

命令: java -jar myspark-1.0-SNAPSHOT.jar myspark-1.0-SNAPSHOT.jar hdfs://single:9000/input/word.txt hdfs://single:9000/output/out1 错误信息: .......... 14/11/23 06:14:18 INFO SparkDeploySchedulerBackend: Granted executor ID app-20141123061418-0011/0 on hos

slime for mit scheme

很多人写过 Scheme 开发环境的设置.但 Scheme 毕竟是一种 Lisp ,是 Lisp 就应该用 Slime. Chicken Scheme 有一个扩展叫 Chicken Slime, 安装非常简单,但功能极差.安装之后几乎没用. Slime本身带的,contrib目录下的swank-kawa.scm swank-larceny.scm swank-mit-scheme.scm 一个都不能用. 好在这位先生修复了对Mit Scheme的支持.照他指导安装就可以用了. 但他说 "也可以将

Lock-less buffer management scheme for telecommunication network applications

A buffer management mechanism in a multi-core processor for use on a modem in a telecommunications network is described herein. The buffer management mechanism includes a buffer module that provides buffer management services for one or more Layer 2