首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >引用实际用法

引用实际用法
EN

Stack Overflow用户
提问于 2011-09-23 13:12:31
回答 5查看 397关注 0票数 3

我遇到了“引用”这个词,我正在尝试找出一些现实生活中使用它的例子。为每个代码表达式使用AST的能力听起来很棒,但如何在现实生活中使用它呢?

有人知道这样的例子吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-09-23 14:14:33

我认为引用在F#和Nemerle中的用法是完全不同的。在F#中,不使用引号来扩展F#语言本身,而是使用它们来获取一些用标准F#编写的程序的AST (代码数据表示)。

在F#中,这可以通过在<@ ..F# code.. @>中包装一段代码,或者通过向函数添加特殊属性来完成:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[<ReflectedDefinition>]
let foo () = 
  // body of a function (standard F# code)

罗伯特已经提到了这种机制的一些用途--您可以将代码转换为SQL to query database,但还有其他几种用途。例如,您可以:

JavaScript using WebSharper

  • 代码转换为F# F#代码
票数 2
EN

Stack Overflow用户

发布于 2011-09-24 21:05:07

F#和Nemerle引用都用于元编程,但方法不同: Nemerle在编译时使用元编程来扩展语言,而F#在运行时使用它们。

内梅尔

在Nemerle中,在宏中使用引号来拆分代码并生成新的代码。语言本身的大部分都是以这种方式实现的。例如,下面是一个来自官方库的示例--实现when条件构造的宏。Nemerle没有语句,所以if必须有一个else部分:whenunless宏分别为具有空thenelse部分的if提供了简写。when宏还具有扩展的模式匹配功能。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
macro whenmacro (cond, body)
syntax ("when", "(", cond, ")", body)
{
    match (cond)
    {
    | <[ $subCond is $pattern ]> with guard = null
    | <[ $subCond is $pattern when $guard ]> =>
        match (pattern)
        {
        | PT.PExpr.Call when guard != null =>
            // generate expression to replace 'when (expr is call when guard) body'
            <[ match ($subCond) { | $pattern when $guard => $body : void | _ => () } ]>
        | PT.PExpr.Call =>
            // generate expression to replace 'when (expr is call) body'
            <[ match ($subCond) { | $pattern => $body : void | _ => () } ]>
        | _ =>
            // generate expression to replace 'when (expr is pattern) body'
            <[ match ($cond) { | true => $body : void | _ => () } ]>
        }
    | _ =>
            // generate expression to replace 'when (cond) body'
            <[ match ($cond : bool) { | true => $body : void | _ => () } ]>
    }
}

代码使用引号来处理看起来像一些预定义模板的模式,并用相应的match表达式替换它们。例如,将指定给宏的cond表达式与:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<[ $subCond is $pattern when $guard ]>

检查它是否遵循x is y when z模式,并给出组成它的表达式。如果匹配成功,我们可以从我们得到的部分生成一个新的表达式,使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<[
    match ($subCond)
    {
    | $pattern when $guard => $body : void
    | _ => ()
    }
]>

这会将when (x is y when z) body转换为基本的模式匹配表达式。所有这些都是自动类型安全的,并且在使用不当时会产生合理的编译错误。因此,正如您所看到的,quotation提供了一种非常方便且类型安全的代码操作方法。

票数 5
EN

Stack Overflow用户

发布于 2011-09-23 13:17:21

好吧,任何时候你想要以编程的方式操作代码,或者做一些元编程,引用使它更具声明性,这是一件好事。

我已经写了两篇文章,关于这如何让Nemerle的生活变得更容易:herehere

对于现实生活中的例子,有趣的是,Nemerle本身将许多常见语句定义为宏(其中使用了引号)。一些示例包括:ifforforeachwhilebreakcontinueusing

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7529496

复制
相关文章
在MapReduce中利用MultipleOutputs输出多个文件
用户在使用Mapreduce时默认以part-*命名,MultipleOutputs可以将不同的键值对输出到用户自定义的不同的文件中。
星哥玩云
2022/07/03
2.1K0
在MapReduce中利用MultipleOutputs输出多个文件
让Pig在风暴中飞驰——Pig On Storm
1以PigOnStorm直面实时应用开发面的挑战 在TRC(Tencent Realtime Computing)系统中TDProcess负责为各个应用提供实时计算的能力和服务,Storm是TDProcess的核心部件,虽然Storm已经成为开源流式计算领域的实际标准,但其生态系统远没有Hadoop完善,在Storm之上没有像Hive、Pig这类解放应用开发人员的效率提升工具,所以当你决定使用Storm来实现某个应用时,必须首先去熟悉Storm的原理以及API,然后才能基于API编写程序。 熟悉Hadoop
腾讯大数据
2018/01/26
8450
pig中load文件时报错
grunt> A=load 'data.txt' as (name: chararray, id: int, age: int);  2012-09-11 18:06:32,072 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1000: Error during parsing. Encountered " <PATH> "A=load "" at line 3, column 1. Was expectin
闵开慧
2018/03/30
9750
python将多个文件内容输出到一个文件中
生成多个文件脚本 #coding=utf-8 #import os #import sys sql1Script = ''' use scrm_%s; -- 公司code需替换为相应公司的code CREATE OR REPLACE VIEW `scrm_crm_contract` AS SELECT * FROM scrm_jishufuwu.`scrm_crm_contract` WHERE `company_code` = '%s'; -- 更新数据库版本. INSERT INTO gf_db_v
章工运维
2023/05/19
1.2K0
vim打开多个文件、同时显示多个文件、在文件之间切换 打开多个文件:
1.vim还没有启动的时候: 在终端里输入 vim file1 file2 ... filen便可以打开所有想要打开的文件 2.vim已经启动 输入 :open file 可以再打开一个文件,并且此时vim里会显示出file文件的内容。
sunsky
2020/08/19
15.4K0
C++ 中的随机标头系列1
开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情
鲸落c
2022/11/28
1.4K0
C++ 中的随机标头系列1
避免在 JS 中过多使用 IF 语句优化技巧
最近在重构代码时,我发现早期的代码使用太多的 if 语句,其程度是我从未见过的。这就是为什么我认为分享这些简单的技巧是非常重要的,这些技巧可以帮助我们避免过多的使用 if 语句。
前端小智@大迁世界
2020/10/26
2.3K0
使用结构化的标头字段改善HTTP
原文 / https://www.fastly.com/blog/improve-http-structured-headers
LiveVideoStack
2020/08/04
6660
通过主机标头的 XSS
在 IE 中处理重定向时有一个有趣的错误,它可以将任意字符插入到 Host 标头中。假设您有以下 http 响应:
Khan安全团队
2022/01/11
1.6K0
通过 HTTP 标头的 XSS
在某些情况下,在应用程序的一个 HTTP 标头中传递的信息未正确清理,并在请求页面的某处或另一端输出,从而导致 XSS 情况。
Khan安全团队
2022/03/09
2.1K0
设置和获取HTTP标头
%Net.HttpRequest的以下每个属性都包含具有相应名称的HTTP标头的值。如果不设置这些属性,则会自动计算它们:
用户7741497
2022/06/09
2.5K0
常见的HTTP标头介绍
在网络爬虫的实践过程中会遇到诸多挑战,被屏蔽是最令人头疼的一个。幸好,有许多技术可以帮助您免受IP屏蔽带来的影响,这其中,HTTP标头(HTTP Headers)的使用和优化是最有效的方法之一,但它往往也是最被大家低估的方法之一。
用户7850017
2022/05/07
1.1K0
常见的HTTP标头介绍
使用SharpZipLib压缩打包多个内存中的文件
SharpZipLib是C#写的开源压缩解压缩组件,最近项目上遇到一个需求:根据用户选择的项目生成CSV文件并下载,后来改为同时生成2个CSV文件下载下来。想到的解决办法就是将2个CSV文件打包成一个Zip文件,然后供用户下载。
深蓝studyzy
2022/06/16
2.3K0
pig基本语法——输入输出存储查看结构
http://pig.apache.org/docs/r0.17.0/basic.html
Java架构师必看
2021/05/14
4920
使用VIM搜索多个文件[通俗易懂]
使用vim可以方便的搜索多个文件,这个时侯需要使用的命令是:vimgrep。vimgrep的命令格式是:
全栈程序员站长
2022/11/09
2.1K0
Python中跨越多个文件使用全局变量
这个琐碎的指南是关于在 Python 中跨多个文件使用全局变量。但是在进入主题之前,让我们简单地看看全局变量和它们在多个文件中的用途。
Python学习者
2023/10/20
8170
如何使用OpenCV在Python中访问IP摄像头
首先,必须找出网址流是什么。通过在构造函数中提供摄像机的网址流,可以在OpenCV中访问IP摄像机cv2.VideoCapture。可以使用某些网络扫描实用程序(例如在linux上的arp-scan)找到摄像机的IP地址。网址进一步的细节,如Protocol,Credentials和Channel应该可以在相机说明书或软件/手机应用程序中找到。我们通过在网络上搜索相机的型号来找到相机的网址流。
小白学视觉
2020/09/14
6.7K0
使用nano在Linux中编辑文件
GNU nano,简称nano,是大多数Linux发行版的基本内置编辑器。GNU nano是一个小巧友好的文本编辑器. 与基本的文本编辑相比,nano提供许多额外的特性,例如:交互式的查找和替换,定位到指定的行列,自动缩进,特性切换,国际化支持,以及文件名标记完成。本教程中,我们将介绍一些帮助您入门的基本知识。
风研雨墨
2018/08/17
7.3K0
点击加载更多

相似问题

在Pig中处理tar标头

11

在多个R输出文件中写入标头

10

避免在.h文件中包含标头

50

在输出文件中写入elf标头

11

希望避免在单击标头时执行多个操作

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文