Почему переменные локальные переменные не соблюдаются? - PullRequest
0 голосов
/ 31 июля 2010

В этом фрагменте кода fields-types в конце изменяется функцией to-camel-case, в отличие от передачи в качестве локальной переменной родительской функции:

fields-types: ["First Name" "string" "Last Name" "string" "Age" "int"]

to-camel-case: function [name] [
    name/1: lowercase name/1
    replace/all name space ""
]

fill-template-body: func [
    field-labels-types [block!] /local vars fields-names-types
] [
  vars: [member-name member-type]
  field-names-types: copy []
  foreach [field-label field-type] field-labels-types [
      append field-names-types to-camel-case field-label
      append field-names-types field-type
  ]
]

fill-template-body fields-types

Исполнение дает:

>> fill-template-body fields-types
== ["firstName" "string" "lastName" "string" "age" "int"]
>> fields-types
== ["firstName" "string" "lastName" "string" "age" "int"]
>>

Тогда как я хотел бы, чтобы типы полей оставались неизменными:

fields-types: ["First Name" "string" "Last Name" "string" "Age" "int"]

Конечно, я могу попытаться обойти это, изменив to-camel-case, чтобы использовать копию имени, но я думаю, что это не то, что я должен сделать.

Есть ли в Scala что-то вроде ключевых слов var и val?

Ответы [ 2 ]

1 голос
/ 01 августа 2010

Ваша функция наблюдения за верблюдами работает с исходным значением, поэтому, если вы хотите сохранить исходное значение, вам необходимо скопировать его и вернуть измененное значение. Поскольку ваша функция работает с шаблоном, ей нужно скопировать шаблон правильно ??

Итак, что-то вроде этого должно работать:

fill-template-body: func[ labels [block!] /local field-labels-types vars fields-names-types][
  field-labels-types: copy labels
..
1 голос
/ 31 июля 2010

Переменная - это уродливое слово в REBOL, все - даже слова - являются значениями.Это не какой-то семантический новостной реплик, он помогает понять, как течет REBOL.

Я думаю, что значения содержатся в одном гигантском массиве в памяти, где REBOL (язык) использует слова и их контексты.ссылаться и взаимодействовать со значениями.Большинство функций REBOL работают без дублирования этих значений:

head lowercase next uppercase str: "abcd"
remove back tail str

Это одна из наиболее эффективных функций REBOL - вам не нужно копировать для промежуточных процессов, требуя, чтобы это расточительно.Представьте, что этот массив растет, когда каждый раз, когда вы используете replace, uppercase или to-camel-case, значение дублируется.Целые процессы могут быть построены на предпосылке модификации, а не дублирования - действительно, контекст может быть создан без необходимости возвращать значение:

remove-spaces: use [space mark][
    space: charset " ^-"
    [any [mark: space (remove mark) | skip]]
]

parse/all str: "Should Be No Spaces" remove-spaces

При этом становится понятно, куда копировать значения, и я думаю,случайно пересекается с даром REBOL для краткого выражения:

parse/all link: copy title: "An Article on REBOL" remove-spaces
print ["(" link ")" title]

to-camel-case copy field-label

И, конечно, модификация имеет свои ограничения.Иногда это чистое здание с нуля.

...