Различие между 'набором', 'setq', и 'setf' в языке Common LISP?

Это должно сделать это

DECLARE @TABLE      TABLE ( [COLUMN_NAME] sysname );

INSERT INTO @TABLE VALUES 
( 'COL1' ),
( 'COL2' ),
( 'COL3' ),
( 'COL4' ),
( 'COL5' );

DECLARE @json NVARCHAR(MAX) = 
(
    SELECT N'DECLARE @' + REPLACE( COLUMN_NAME, ' ', '_' ) AS MyString
    FROM @TABLE
    FOR JSON PATH
)

SELECT JSON_VALUE(value,'$.MyString') AS 'JSON Transform'
FROM OPENJSON(@json,' 

Результаты

+--------------+
|JSON Transform|
+--------------+
| DECLARE @COL1|
| DECLARE @COL2|
| DECLARE @COL3|
| DECLARE @COL4|
| DECLARE @COL5|
+--------------+

Эта ссылка поможет вам понять функции OPENJSON и JSON_VALUE, Выражения JSON Path [114 ]

)

Результаты

+--------------+
|JSON Transform|
+--------------+
| DECLARE @COL1|
| DECLARE @COL2|
| DECLARE @COL3|
| DECLARE @COL4|
| DECLARE @COL5|
+--------------+

Эта ссылка поможет вам понять функции OPENJSON и JSON_VALUE, Выражения JSON Path [114 ]

158
задан Jay 31 July 2015 в 20:27
поделиться

3 ответа

Изначально в Лиспе не было лексических переменных - только динамические. И не было ни SETQ, ни SETF, только функция SET.

То, что теперь записывается как:

(setf (symbol-value '*foo*) 42)

, было записано как:

(set (quote *foo*) 42)

, что в конечном итоге было сокращено до SETQ (SET Quoted):

(setq *foo* 42)

Затем появились лексические переменные, и SETQ стали использоваться для присвоения им тоже - так что это больше не была простой оболочкой вокруг SET.

Позже кто-то изобрел SETF (SET Field) как общий способ присвоения значений структурам данных, чтобы отразить l-значения для других языков:

x.car := 42;

будет записано как

(setf (car x) 42)

Для симметрии и общности SETF также предоставляет функциональные возможности SETQ. На этом этапе было бы правильно сказать, что SETQ был примитивом низкого уровня, а SETF - операцией высокого уровня.

Затем появились макросы символов. Чтобы макросы символов могли работать прозрачно, было понято, что SETQ должен действовать как SETF, если «переменная»

165
ответ дан 23 November 2019 в 21:39
поделиться

setq аналогичен set с первым аргументом в кавычках - (set 'foo' (bar baz)) аналогичен (setq foo '(bar baz)) . setf , с другой стороны, действительно тонкий - это похоже на «косвенное обращение». Я предлагаю http://www.nano.com/lisp/cmucl-tutorials/LISP-tutorial-16.html как лучший способ начать его понимание, чем любой ответ здесь может дать ... в вкратце, setf принимает первый аргумент как «ссылку», так что, например, (aref myarray 3) будет работать (как первый аргумент для setf ), чтобы установить элемент внутри массива.

21
ответ дан 23 November 2019 в 21:39
поделиться
(set ls '(1 2 3 4)) => Error - ls has no value

(set 'ls '(1 2 3 4)) => OK

(setq ls '(1 2 3 4)) => OK - make ls to (quote ls) and then have the usual set

(setf ls '(1 2 3 4)) => OK - same as setq so far BUT

(setf (car ls) 10) => Makes ls '(10 2 3 4) - not duplicated by setq/set
132
ответ дан 23 November 2019 в 21:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: