module Kernel
  #
  #  call-seq:
  #     obj.clone(freeze: nil) -> an_object
  #
  #  Produces a shallow copy of obj---the instance variables of
  #  obj are copied, but not the objects they reference.
  #  #clone copies the frozen value state of obj, unless the
  #  +:freeze+ keyword argument is given with a false or true value.
  #  See also the discussion under Object#dup.
  #
  #     class Klass
  #        attr_accessor :str
  #     end
  #     s1 = Klass.new      #=> #
  #     s1.str = "Hello"    #=> "Hello"
  #     s2 = s1.clone       #=> #
  #     s2.str[1,4] = "i"   #=> "i"
  #     s1.inspect          #=> "#"
  #     s2.inspect          #=> "#"
  #
  #  This method may have class-specific behavior.  If so, that
  #  behavior will be documented under the #+initialize_copy+ method of
  #  the class.
  #
  def clone(freeze: nil)
    __builtin_rb_obj_clone2(freeze)
  end
  module_function
  #
  #  call-seq:
  #     Float(arg, exception: true)    -> float or nil
  #
  #  Returns arg converted to a float. Numeric types are
  #  converted directly, and with exception to String and
  #  nil the rest are converted using
  #  arg.to_f.  Converting a String with invalid
  #  characters will result in a ArgumentError.  Converting
  #  nil generates a TypeError.  Exceptions can be
  #  suppressed by passing exception: false.
  #
  #     Float(1)                 #=> 1.0
  #     Float("123.456")         #=> 123.456
  #     Float("123.0_badstring") #=> ArgumentError: invalid value for Float(): "123.0_badstring"
  #     Float(nil)               #=> TypeError: can't convert nil into Float
  #     Float("123.0_badstring", exception: false)  #=> nil
  #
  def Float(arg, exception: true)
    __builtin_rb_f_float(arg, exception)
  end
end